mercredi 15 février 2012

OpenGL ES à partir de zéro, la partie 1 Addendum: Alphabet Soup

Un problème avec blogues, c'est qu'ils sont auto-édités. Pour mes messages ici, je n'ai aucun examen technique externe et aucune correction de copie fait. Surtout, il n'est pas trop un problème, comme des gens intelligents lire ce blog et rapidement remarquer mes erreurs, et les gens semblent être assez indulgent parfois la gaffe grammaire ou d'orthographe.

Mais, parfois, le résultat de ce qui est une production de one-man est que je manque quelque chose que j'ai vraiment, vraiment devrait avoir inclus. Alors que la relecture partie 4, J'ai réalisé que j'ai utilisé à la fois glLightfv () et glLightf () et il m'est apparu que je n'avais jamais expliqué le format de nommage pour les appels de fonctions OpenGL. De retour à partie 1, Je suis passé par tous les ennuis d'expliquer les types de données différents OpenGL, mais je n'ai pas expliqué comment ils liés à la soupe à l'alphabet à la fin de l'appel de fonction.

Alors, laissez-moi corriger ce pour ceux d'entre vous qui n'ont pas pensé à elle déjà.

Appels OpenGL qui ne prennent pas tous les paramètres n'ont pas soupe à l'alphabet à l'end.There n'existe qu'une seule version de ces méthodes. Voici un exemple:

    GL_ENUM error = glGetError();

La même chose est fondamentalement vrai pour les méthodes qui prennent seulement un type spécifique de paramètres, tels que GL_ENUM:

    glEnable(GL_COLOR_ARRAY);

Cependant, la grande majorité des appels de fonctions OpenGL peuvent être faites en utilisant plus d'un dataype. Cela est beaucoup plus prononcée dans OpenGL réguliers, où la plupart des appels de fonction ont au moins une demi-douzaine de variantes différentes, vous permettant de passer GLshort, GLbyte, reflet, GLfloat, GLDouble ou GLfixed par valeur ou par référence. En OpenGL ES, il ya un sous-ensemble plus petit d'appels de fonctions et de types de données, de sorte qu'il n'est pas aussi intimidant ou confus, cependant OpenGL ES suit toujours la même convention d'appellation, c'est donc une bonne idée de comprendre ce que cela signifie soupe à l'alphabet.

La première et parfois la deuxième lettre du nom de la fonction de spécifier le type de données que cette méthode prend. Voici un tableau qui explique ce que chaque suffixe se réfère à:
  • b GLbyte
  • s GLshort
  • i GLint
  • f GLfloat
  • ub GLubyte
  • us GLushort
  • ui GLuint
Ainsi, glFoof () pourrait s'attendre à une GLfloat être transmis, tandis glFoos () pourrait s'attendre à une GLshort.
Note: En OpenGL régulier, il peut aussi y avoir un certain nombre dans le cadre du suffixe. Ce nombre représente le nombre de ce type de données qui est nécessaire. Ainsi, par exemple, le glVertex3f function () prend trois GLfloats. Puisque cette convention de nommage est surtout utilisé en mode direct, qui OpenGL ES ne dispose pas, vous ne verrez pas cette convention de nommage comme souvent dans OpenGL ES, cependant il ya quelques fonctions qui suivent cette convention de nommage, comme glColor4f (). OpenGL ES ne supporte pas, par exemple, glColor3f (), mais conserve le nombre dans le cadre du préfixe pour maximiser la compatibilité entre les deux API

Comme vous l'avez vu revenir dans la partie 4, parfois fonctions servent un objectif plus générique, comme glLightf (). Vous appelez cette méthode pour définir de nombreux attributs différents d'une lumière donnée. Vous utilisez cet appel pour régler, par exemple, la coupure place ainsi que la position de la lumière dans l'espace 3D. Coupure spot nécessite une valeur unique, mais la position de la lumière nécessite trois.

Pour ces fonctions, il ya une variante supplémentaire marquée par AV à la fin du nom de méthode, après les lettres type de données. Si vous avez besoin pour passer un type de données régulières pour OpenGL, vous n'utilisez pas ce suffixe et juste passer dans le type de données dont vous avez besoin en termes de valeur. Mais, si vous avez besoin de fournir plus d'un type de données natif OpenGL unique (en d'autres termes, cette liste de la partie 1), alors vous devez mettre les valeurs dans un tableau et passer un pointeur vers le début de ce tableau. Lorsque vous transmettez des valeurs en OpenGL par référence comme cela, alors vous utilisez l'appel de fonction avec le suffixe v.

Donc, retour dans la partie 4, lorsque nous avons dit la valeur OpenGL cuttoff place, nous avons utilisé la régulière non-v version, comme ceci:

    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);

mais, lorsque nous avons adopté la position de la lumière, qui prend trois GLfloats, nous avons utilisé la variante V et passés dans un tableau, ce qui est exactement la même chose que passer un pointeur à la première valeur du tableau:

    const GLfloat light0Position[] = {0.0, 10.0, 10.0, 0.0}; 
glLightfv(GL_LIGHT0, GL_POSITION, light0Position);

J'espère que cela aide quelqu'un qui a été confondu par les noms de fonctions. À un certain moment, je vais essayer d'intégrer ces informations dans la partie 1, mais je, car il a eu la gentillesse d'une inadvertance manifeste de ma part, je voulais le poste.

Aucun commentaire: