Avant même de commencer à travailler avec les OpenGLS, prenons quelques minutes pour parler de son histoire. L'évolution d'OpenGL a grandement affecté l'architecture et la conception de la bibliothèque. En conséquence, il vaut la peine d'investir quelques minutes pour comprendre d'où il vient, il vous aidera à mieux l'utiliser. Si vous avez principalement ou uniquement travaillé dans les langages de programmation orientés objet comme Objective-C et Java, OpenGL ES peut sembler un peu étrange et même à l'ancienne car elle est une API procédurale, pas un orienté objet.
Ce n'était pas seulement le matériel qui était différent à l'époque. L'état de la programmation informatique a été également très différentes. Bien que le concept de programmation orientée objet existait, il n'était pas en utilisation courante encore, et la plupart des ordinateurs ont été programmés en utilisant des langages procéduraux comme le C, Pascal, et BASE, ou bien ont été écrit directement en langage assembleur. En conséquence, IRIS GL est une bibliothèque d'appels de fonctions procédurales qui pourraient être utilisés à partir de ces langues, avec C étant le plus commun.
L'Open Gamble
Une décennie de sa création, SGI s'est imposée comme le leader du secteur pour la programmation de graphismes sophistiqués. En 1992, SGI a décidé de faire une refonte massive et ré-écriture de l'IRIS GL, et ils ont également décidé de faire quelque chose assez extraordinaire: permettre à leurs concurrents d'accorder une licence de la nouvelle version de leur bibliothèque graphique. Encore plus extraordinaire est le fait que ils ont publié la spécification de leur bibliothèque comme un standard ouvert que n'importe qui pouvait mettre en œuvre. En conséquence, la bibliothèque graphique révisé pourrait être porté vers d'autres matériels et plates-formes logicielles, et les vendeurs de matériel graphique pourrait rendre leurs produits compatibles avec cette nouvelle langue graphique en écrivant simplement les pilotes de périphériques à la norme ouverte. La réécriture de l'IRIS GL et la nouvelle spécification ouverte ont tous deux été baptisée OpenGL. À ce jour, OpenGL est le seul véritable multi-plateforme, la langue agnostique, du matériel de bibliothèque graphique accéléré en usage commun. Son principal concurrent, DirectX, est uniquement disponible sur les systèmes d'exploitation de Microsoft, y compris les divers systèmes Windows et d'exploitation Windows Mobile, ainsi que l'OS qui gère le Xbox et Xbox 360.
OpenGL prospéré. Il a commencé à être utilisé non seulement pour les programmes de modélisation 3D et les simulations scientifiques, mais que les ordinateurs obtenu plus puissant, il a commencé à être utilisé pour les jeux 3D. SGI n'a pas fait aussi bien que la bibliothèque a créé. Comme les ordinateurs sont devenus plus capables, le besoin de coûteuses stations de travail haut de gamme comme le SGI ceux fabriqués a commencé à diminuer, et SGI est devenu l'ombre de lui-même, finit par déclarer faillite il ya quelques années. Bien qu'il y est une compagnie a appelé aujourd'hui Silicon Graphics, ce n'est pas la même société qui a jadis dominé l'industrie de la programmation graphique; SGI a vendu son nom à une autre société dans le cadre de leur procédure de faillite.
Cependant, la même augmentation de puissance de calcul qui ont contribué à la chute de SGI a été une aubaine pour les multi-plateforme OpenGL. Avant longtemps, accélération graphique matérielle étaient utilisées partout. Depuis OpenGL permet aux programmeurs ciblant tout système d'exploitation pour profiter de l'accélération matérielle sans avoir à écrire sur n'importe quel matériel spécifique, un programme écrit en utilisant OpenGL pourrait obtenir le bénéfice de l'accélération matérielle, indépendamment du système d'exploitation, carte graphique ou processeur qu'il a été exécuté sur (en supposant, bien sûr, que la carte graphique supportant OpenGL). Cela a pris beaucoup de stress et le travail de programmation graphique, car elle signifiait que les programmeurs n'ont plus eu à écrire à un matériel spécifique afin d'obtenir de bonnes performances, ils pourraient simplement écrire à la norme. Le code qui écrit directement au matériel tend à se briser sur le matériel qu'il n'a pas été écrit pour, donc les jeux utilisant OpenGL écrite ont tendance à être moins fragile que celles écrites directement sur le matériel et avoir plus longue durée de vie. Les programmes écrits en utilisant OpenGL sont également beaucoup plus facile de port à d'autres plates-formes informatiques, car les types de données et des appels de fonctions sont exactement les mêmes, peu importe où votre code s'exécute. OpenGL permet aux développeurs de passer moins de temps sur l'optimisation des performances et plus de temps sur les tâches de codage spécifique nécessaire à leur application.
Un des défis auxquels sont confrontés les concepteurs de l'OpenGL ES est que toutes les langues de définir exactement les types de données même, et dans certaines langues, comme le C, la taille exacte de ces types de données peuvent varier. Par exemple, le int datatype dans C est basé sur le registre de taille du matériel en cours de compilation pour les. Cela signifie une int peut être compilé en un nombre différent d'octets sur un matériel différent. Pour faire face à ce problème, OpenGL définit ses propres types de données, qui commencent par les lettres GL. Lorsque vous travaillez dans OpenGL ES, au lieu d'utiliser intPar exemple, vous auriez probablement choisi d'utiliser GLint ou peut-être GLshort. Bien que ces types de données sont tous entiers et tous les travaux, la taille de int est différent sur différentes plateformes. La taille des GLint and GLshortCependant, sont les mêmes sur chaque système d'exploitation, dans toutes les langues, et sur tout le matériel, ce qui donne des résultats plus prévisibles, en évitant la conversion d'exécution, et plus généralement de rendre la vie beaucoup plus facile.
Vous devraient s'efforcer d'utiliser les types de données OpenGL ES pour toutes les données qui pourraient être soumises dans le cadre d'un appel bibliothèque OpenGL ES, ou qui est extraite d'un appel bibliothèque OpenGL ES. Pour les variables qui ne seront jamais interagir avec OpenGL, vous n'avez pas à utiliser un type de données OpenGL et, en fait, vous pouvez trouver cela rend le code plus clair si vous utilisez les types de données OpenGL uniquement pour les valeurs qui seront utilisées par OpenGL ES et l'utilisation régulière types de données C comme int datatypes CoreFoundation ou comme NSInteger partout ailleurs.
Les types de données OpenGL ES sont comme suit:
Toujours faire un effort pour utiliser le plus petit type de données qui convient à vos besoins. Par exemple, si vous savez que vous n'aurez jamais plus d'un millier sommets dans un objet particulier, ne pas utiliser une GLint pour stocker les indices de vertex pour cet objet, depuis une GLshort est plus que capable de contenir tous les chiffres jusqu'à un millier. Il ya quelques exceptions à cette règle que nous allons parler plus tard dans le livre, mais c'est une bonne règle générale à garder à l'esprit alors que vous êtes de programmation. Rappelez-vous, l'iPhone a des ressources mémoire limitées par rapport à votre ordinateur portable ou de bureau, et ceux octets supplémentaires peuvent s'additionner.
A peu de choses à remarquer quand on regarde le tableau ci-dessus: d'abord, il n'ya pas GLdouble. OpenGL ES 2.0 ne dispose pas de variables à virgule flottante double précision. Ils ont été volontairement laissés de côté à cause de l'accent OpenGL ES sur les performances et l'utilisation des ressources. Les auteurs de la spécification OpenGL ES a estimé que les tailles d'écran de dispositifs embarqués ne bénéficieraient pas de l'utilisation de la double précision (64 bits) des valeurs en virgule flottante, et que leur utilisation pourrait très vite manger les ressources système limitées disponibles sur un ces périphériques. Deuxièmement, les deux derniers types de données sur la liste, GLfixed and GLclampx, Sont utilisés pour représenter des valeurs en virgule flottante en utilisant des types de données entier en utilisant quelque chose qui s'appelle la représentation à virgule fixe.
C'est une optimisation commune sur les systèmes où les performances en mathématiques flottantes point est considérablement plus lent que les performances en mathématiques entier. Comme tous les iPhones, iPod Touch et l'iPad ont GPU qui fonctionnent nativement avec les nombres à virgule flottante et sont capables de faire très rapidement des opérations en virgule flottante, nous ne serons pas discuter de l'utilisation des mathématiques point fixe dans ce livre à tous.
En OpenGL ES, ce n'est pas du tout le cas. Garder avec un accent OpenGL ES sur le rendement, les nouvelles versions d'OpenGL ES abandonnent souvent en charge des fonctions utilisées dans la version précédente, surtout si d'une façon plus rapide ou plus efficace d'accomplir cette tâche a été ajouté à la version ultérieure. Afin de profiter pleinement de matériel d'aujourd'hui iOS, vous devez utiliser OpenGL ES 2.0. Même si les périphériques actuels ne supportent OpenGL ES 1.1, vous ne pouvez pas mélanger 1.1 et 2.0 du code. En conséquence, ce livre traite exclusivement avec OpenGL ES 2.0.
GLenum erreur = glGetError ();
Cette fonction est utilisée pour déterminer si des erreurs s'est produite dans le précédent appel d'OpenGL ES fonction. La plupart des fonctions OpenGL ES ne reviennent pas eux-mêmes un code d'erreur, vous devez donc appeler cette fonction séparément si vous voulez savoir si tout a fonctionné bien.
Si une fonction prend un ou plusieurs arguments, mais il est toujours et seulement prend un type spécifique d'argumentation, alors la fonction ne sera généralement pas aussi ont des caractères à la fin, tels que:
glUseProgram(program);
Dans le commencement, il ya IRIS GL
En 1981, une société appelée Silicon Graphics, Inc (souvent désignées par leurs initiales, SGI) A été fondé et a commencé à faire haut de gamme 3D stations de travail graphiques. Tous les premiers modèles de machines SGI ont donné le nom "IRIS" avec un numéro de modèle. IRIS a été en fait un acronyme qui se tenait pour la Intégré Raster Imaging System; Bien sûr, l'acronyme avait un double sens, puisque «iris» est aussi un terme anatomique se référant à une partie de l'œil. Graphisme de programmation sur ces postes de travail a été fait en utilisant un ensemble d'API appelée la langue IRIS Graphics, habituellement raccourci IRIS GL. Maintenant, si vous étiez la programmation dans le début des années 1980, vous vous souvenez probablement que les choses étaient très différentes. Même si vous n'étiez pas de programmation à l'époque, vous avez probablement réaliser juste combien de temps de 30 ans est dans l'industrie de la technologie qui évolue rapidement. En 1981, le Mac n'avait pas encore été introduit. Consommateurs au niveau des ordinateurs étaient des machines, comme l'Apple / / e, l'IBM PC, et le Commodore 64, dont aucun n'avait la puissance nécessaire pour travailler efficacement avec des graphiques 3D en temps réel. La plupart des ordinateurs n'ont pas les processeurs à virgule flottante, et les processeurs graphiques dédiés sont extrêmement rares, ils ne seraient pas devenues courantes depuis près une autre décennie. Les stations de travail IRIS, d'autre part, le matériel utilisé beaucoup plus sophistiqués que ces machines des consommateurs et ont été spécifiquement conçus pour gérer le grand nombre de calculs en virgule flottante nécessaire dans la programmation graphique en 3D.Ce n'était pas seulement le matériel qui était différent à l'époque. L'état de la programmation informatique a été également très différentes. Bien que le concept de programmation orientée objet existait, il n'était pas en utilisation courante encore, et la plupart des ordinateurs ont été programmés en utilisant des langages procéduraux comme le C, Pascal, et BASE, ou bien ont été écrit directement en langage assembleur. En conséquence, IRIS GL est une bibliothèque d'appels de fonctions procédurales qui pourraient être utilisés à partir de ces langues, avec C étant le plus commun.
Qu'est-ce qu'un nom?
IRIS GL est toujours écrit avec un espace entre IRIS and GL and IRIS est toujours écrit en lettres majuscules, parce que c'est un acronyme. D'autre part, OpenGL est écrit sans espace entre Open and GL et seuls les S, G et L sont capitalisés.
IRIS GL est toujours écrit avec un espace entre IRIS and GL and IRIS est toujours écrit en lettres majuscules, parce que c'est un acronyme. D'autre part, OpenGL est écrit sans espace entre Open and GL et seuls les S, G et L sont capitalisés.
L'Open Gamble
Une décennie de sa création, SGI s'est imposée comme le leader du secteur pour la programmation de graphismes sophistiqués. En 1992, SGI a décidé de faire une refonte massive et ré-écriture de l'IRIS GL, et ils ont également décidé de faire quelque chose assez extraordinaire: permettre à leurs concurrents d'accorder une licence de la nouvelle version de leur bibliothèque graphique. Encore plus extraordinaire est le fait que ils ont publié la spécification de leur bibliothèque comme un standard ouvert que n'importe qui pouvait mettre en œuvre. En conséquence, la bibliothèque graphique révisé pourrait être porté vers d'autres matériels et plates-formes logicielles, et les vendeurs de matériel graphique pourrait rendre leurs produits compatibles avec cette nouvelle langue graphique en écrivant simplement les pilotes de périphériques à la norme ouverte. La réécriture de l'IRIS GL et la nouvelle spécification ouverte ont tous deux été baptisée OpenGL. À ce jour, OpenGL est le seul véritable multi-plateforme, la langue agnostique, du matériel de bibliothèque graphique accéléré en usage commun. Son principal concurrent, DirectX, est uniquement disponible sur les systèmes d'exploitation de Microsoft, y compris les divers systèmes Windows et d'exploitation Windows Mobile, ainsi que l'OS qui gère le Xbox et Xbox 360.
OpenGL prospéré. Il a commencé à être utilisé non seulement pour les programmes de modélisation 3D et les simulations scientifiques, mais que les ordinateurs obtenu plus puissant, il a commencé à être utilisé pour les jeux 3D. SGI n'a pas fait aussi bien que la bibliothèque a créé. Comme les ordinateurs sont devenus plus capables, le besoin de coûteuses stations de travail haut de gamme comme le SGI ceux fabriqués a commencé à diminuer, et SGI est devenu l'ombre de lui-même, finit par déclarer faillite il ya quelques années. Bien qu'il y est une compagnie a appelé aujourd'hui Silicon Graphics, ce n'est pas la même société qui a jadis dominé l'industrie de la programmation graphique; SGI a vendu son nom à une autre société dans le cadre de leur procédure de faillite.
Le Campus de SGI
A la hauteur du succès, le siège de SGI sont situés dans un beau bâtiment complexe multi-à Mountain View, en Californie, avec piscine, des sentiers pédestres boisés, et 500 000 pieds carrés d'espace de bureau. Le campus existe encore aujourd'hui. Google l'utilise comme son siège mondial et l'appelle Googleplex.
A la hauteur du succès, le siège de SGI sont situés dans un beau bâtiment complexe multi-à Mountain View, en Californie, avec piscine, des sentiers pédestres boisés, et 500 000 pieds carrés d'espace de bureau. Le campus existe encore aujourd'hui. Google l'utilise comme son siège mondial et l'appelle Googleplex.
Cependant, la même augmentation de puissance de calcul qui ont contribué à la chute de SGI a été une aubaine pour les multi-plateforme OpenGL. Avant longtemps, accélération graphique matérielle étaient utilisées partout. Depuis OpenGL permet aux programmeurs ciblant tout système d'exploitation pour profiter de l'accélération matérielle sans avoir à écrire sur n'importe quel matériel spécifique, un programme écrit en utilisant OpenGL pourrait obtenir le bénéfice de l'accélération matérielle, indépendamment du système d'exploitation, carte graphique ou processeur qu'il a été exécuté sur (en supposant, bien sûr, que la carte graphique supportant OpenGL). Cela a pris beaucoup de stress et le travail de programmation graphique, car elle signifiait que les programmeurs n'ont plus eu à écrire à un matériel spécifique afin d'obtenir de bonnes performances, ils pourraient simplement écrire à la norme. Le code qui écrit directement au matériel tend à se briser sur le matériel qu'il n'a pas été écrit pour, donc les jeux utilisant OpenGL écrite ont tendance à être moins fragile que celles écrites directement sur le matériel et avoir plus longue durée de vie. Les programmes écrits en utilisant OpenGL sont également beaucoup plus facile de port à d'autres plates-formes informatiques, car les types de données et des appels de fonctions sont exactement les mêmes, peu importe où votre code s'exécute. OpenGL permet aux développeurs de passer moins de temps sur l'optimisation des performances et plus de temps sur les tâches de codage spécifique nécessaire à leur application.
La montée de l'OpenGL ES
En 2006, il devint évident que l'augmentation de la puissance de calcul conduirait rapidement à de petits appareils de poche capable d'afficher des graphismes 3D. Avec un oeil vers l'efficacité, une nouvelle bibliothèque graphique a été créé en prenant une ancienne version de la spécification OpenGL et décapage quelques-unes des fonctionnalités qui pourraient avoir eu un impact négatif sur la performance. L'équipe travaillant sur cette spécification de nouveaux graphismes mobiles enlevés mode immédiat (parfois appelé mode direct, Plus lent, méthode plus fastidieuse de programmation graphique qui est en grande partie obsolète, mais il est encore souvent utilisé pour enseigner la programmation graphique), double-précision des variables à virgule flottante, et le soutien pour les polygones autres que les triangles, pour n'en nommer que quelques petites choses. Cette nouvelle, plus légère, plus efficace la bibliothèque graphique a été baptisée OpenGL pour les systèmes embarqués, Ou tout simplement OpenGL ES.Bases OpenGL
Parce qu'ils avaient une bibliothèque très complexe procédure, SGI a réalisé très tôt qu'ils devaient venir avec quelques modèles très distincts et cohérents pour faire nommer leur bibliothèque utilisable et développeur de l'environnement. Comprendre les conventions de nommage utilisées par les concepteurs de l'OpenGL, il est plus facile de trouver ce que vous recherchez et il est plus facile de comprendre ce que le code existant fait. Quand vous regardez le code OpenGL, il peut ressembler à un fouillis de non-sens. Une fois que vous comprenez ses conventions de nommage, cependant, les noms bizarres commencent à faire énormément de sens. Laissons-nous sur ces conventions rapidement avant d'aller plus loin.Un des défis auxquels sont confrontés les concepteurs de l'OpenGL ES est que toutes les langues de définir exactement les types de données même, et dans certaines langues, comme le C, la taille exacte de ces types de données peuvent varier. Par exemple, le int datatype dans C est basé sur le registre de taille du matériel en cours de compilation pour les. Cela signifie une int peut être compilé en un nombre différent d'octets sur un matériel différent. Pour faire face à ce problème, OpenGL définit ses propres types de données, qui commencent par les lettres GL. Lorsque vous travaillez dans OpenGL ES, au lieu d'utiliser intPar exemple, vous auriez probablement choisi d'utiliser GLint ou peut-être GLshort. Bien que ces types de données sont tous entiers et tous les travaux, la taille de int est différent sur différentes plateformes. La taille des GLint and GLshortCependant, sont les mêmes sur chaque système d'exploitation, dans toutes les langues, et sur tout le matériel, ce qui donne des résultats plus prévisibles, en évitant la conversion d'exécution, et plus généralement de rendre la vie beaucoup plus facile.
Vous devraient s'efforcer d'utiliser les types de données OpenGL ES pour toutes les données qui pourraient être soumises dans le cadre d'un appel bibliothèque OpenGL ES, ou qui est extraite d'un appel bibliothèque OpenGL ES. Pour les variables qui ne seront jamais interagir avec OpenGL, vous n'avez pas à utiliser un type de données OpenGL et, en fait, vous pouvez trouver cela rend le code plus clair si vous utilisez les types de données OpenGL uniquement pour les valeurs qui seront utilisées par OpenGL ES et l'utilisation régulière types de données C comme int datatypes CoreFoundation ou comme NSInteger partout ailleurs.
Les types de données OpenGL ES sont comme suit:
| Type | Bytes | Min | Max | Comment |
|---|---|---|---|---|
| GLenum | 4 | 0 | 4,294,967,295 | Pour les types énumérés |
| GLboolean | 1 | 0 | 255 | Valeur booléenne, GL_TRUE or GL_FALSE |
| GLbitfield | 4 | - | - | Peut contenir jusqu'à 32 booléens, l'un par bit |
| GLbyte | 1 | -128 | 127 | |
| GLshort | 2 | -32,768 | 32,767 | |
| GLint | 4 | -2,147,483,648 | 2,147,483,647 | |
| GLsizei | 4 | -2,147,483,648 | 2,147,483,647 | Similaire à size_t |
| GLubyte | 1 | 0 | 255 | |
| GLushort | 2 | 0 | 65,535 | |
| GLuint | 4 | 0 | 4,294,967,295 | |
| GLfloat | 4 | - | - | Variable en virgule flottante |
| GLclampf | 4 | - | - | À virgule flottante compris entre 0,0 et 1,0 |
| GLvoid | - | - | - | Aucune valeur |
| GLfixed | 4 | - | - | Nombres à virgule fixe |
| GLclampx | 4 | - | - | Virgule fixe entre 0,0 et 1,0 |
Toujours faire un effort pour utiliser le plus petit type de données qui convient à vos besoins. Par exemple, si vous savez que vous n'aurez jamais plus d'un millier sommets dans un objet particulier, ne pas utiliser une GLint pour stocker les indices de vertex pour cet objet, depuis une GLshort est plus que capable de contenir tous les chiffres jusqu'à un millier. Il ya quelques exceptions à cette règle que nous allons parler plus tard dans le livre, mais c'est une bonne règle générale à garder à l'esprit alors que vous êtes de programmation. Rappelez-vous, l'iPhone a des ressources mémoire limitées par rapport à votre ordinateur portable ou de bureau, et ceux octets supplémentaires peuvent s'additionner.
A peu de choses à remarquer quand on regarde le tableau ci-dessus: d'abord, il n'ya pas GLdouble. OpenGL ES 2.0 ne dispose pas de variables à virgule flottante double précision. Ils ont été volontairement laissés de côté à cause de l'accent OpenGL ES sur les performances et l'utilisation des ressources. Les auteurs de la spécification OpenGL ES a estimé que les tailles d'écran de dispositifs embarqués ne bénéficieraient pas de l'utilisation de la double précision (64 bits) des valeurs en virgule flottante, et que leur utilisation pourrait très vite manger les ressources système limitées disponibles sur un ces périphériques. Deuxièmement, les deux derniers types de données sur la liste, GLfixed and GLclampx, Sont utilisés pour représenter des valeurs en virgule flottante en utilisant des types de données entier en utilisant quelque chose qui s'appelle la représentation à virgule fixe.
C'est une optimisation commune sur les systèmes où les performances en mathématiques flottantes point est considérablement plus lent que les performances en mathématiques entier. Comme tous les iPhones, iPod Touch et l'iPad ont GPU qui fonctionnent nativement avec les nombres à virgule flottante et sont capables de faire très rapidement des opérations en virgule flottante, nous ne serons pas discuter de l'utilisation des mathématiques point fixe dans ce livre à tous.
Versions d'OpenGL
Les deux OpenGL et OpenGL ES venir dans plusieurs versions différentes. Avec stations de travail OpenGL, chaque version nouvellement libérés tend à construire sur l'ancien, mais ont toujours resté presque totalement rétrocompatible avec les versions antérieures. Ainsi, par exemple, la plupart du code OpenGL 1.5 sera compiler et exécuter très bien l'utilisation d'OpenGL 3.0. Versions 3.1, 3.2 et 4.0 ont commencé à retirer le mode direct et quelques fonctionnalités d'autres anciens, mais toujours de maintenir une quantité incroyable de compatibilité descendante avec les versions précédentes.En OpenGL ES, ce n'est pas du tout le cas. Garder avec un accent OpenGL ES sur le rendement, les nouvelles versions d'OpenGL ES abandonnent souvent en charge des fonctions utilisées dans la version précédente, surtout si d'une façon plus rapide ou plus efficace d'accomplir cette tâche a été ajouté à la version ultérieure. Afin de profiter pleinement de matériel d'aujourd'hui iOS, vous devez utiliser OpenGL ES 2.0. Même si les périphériques actuels ne supportent OpenGL ES 1.1, vous ne pouvez pas mélanger 1.1 et 2.0 du code. En conséquence, ce livre traite exclusivement avec OpenGL ES 2.0.
Alphabet Soup: Fonctions OpenGL
Parce que vous travaillez avec une bibliothèque de procédure, tout ce que vous faites dans OpenGL ES est accompli en faisant la norme appelle la fonction C, et toutes les fonctions OpenGL ES commencent par les lettres gl. Beaucoup de fonctions OpenGL ES ont également une chaîne de caractères à la fin que vous dire un peu plus sur les paramètres de la fonction attend que vous passiez po OpenGL ES fonctions qui ne prennent pas tous les paramètres n'ont pas ces lettres à la fin, par exemple:GLenum erreur = glGetError ();
Cette fonction est utilisée pour déterminer si des erreurs s'est produite dans le précédent appel d'OpenGL ES fonction. La plupart des fonctions OpenGL ES ne reviennent pas eux-mêmes un code d'erreur, vous devez donc appeler cette fonction séparément si vous voulez savoir si tout a fonctionné bien.
Si une fonction prend un ou plusieurs arguments, mais il est toujours et seulement prend un type spécifique d'argumentation, alors la fonction ne sera généralement pas aussi ont des caractères à la fin, tels que:
glUseProgram(program);
La fonction ci-dessus, glUseProgram(), Toujours et ne prend que GLuint, Et il n'ya pas d'autres versions de cette fonction particulière. En conséquence, il n'ya pas de soupe à l'alphabet, à la fin du nom de fonction, car il n'est pas nécessaire pour cela. Vous n'avez pas le choix dans le type de données pour passer po Ne pas trop se soucier de ce que cette fonction ne fait pour l'instant, vous allez commencer à l'utiliser dans quelques chapitres et sera très bien la connaître d'ici la fin du livre .
Name par tout autre nom.
OpenGL a une certaine terminologie qui peut être carrément parfois à confusion. OpenGL prend souvent les mots et leur donne un sens très précis qui est différent de l'usage anglais courant. Parfois, cette utilisation est tellement différent que l'utilisation du terme semble en contradiction avec le sens clair-anglaise du mot. Un exemple de ceci est le mot name. Dans le langage OpenGL, une name est un nombre, généralement un GLint or GLuint. En OpenGL ES, names ne sont jamais une chaîne et ne jamais avoir aucune signification sémantique. Que signifie par OpenGL name est simplement un identifiant unique pour un objet spécifique. La raison à cela est que les entiers sont beaucoup plus efficaces à utiliser pour identifier un objet, des comparaisons de chaînes, d'autre part, sont coûteuses.
Quand vous demandez à OpenGL pour créer un objet ^ 1 pour vous en utilisant une fonction, elle va lui assigner une valeur entière unique pour identifier l'objet qu'elle crée et qu'elle sera de retour que le nombre entier unique au code appelant. Lorsque vous souhaitez plus tard pour faire quelque chose avec un objet spécifique, vous passez de l'objet name (Le nombre retourné par l'appel plus tôt) à OpenGL comme l'un des arguments à l'appel de fonction afin de dire à OpenGL ES quel objet de l'appel de fonction doit agir.
Un grand nombre d'appels de fonction OpenGL peuvent être faites en utilisant plus d'un type de données, cependant. OpenGL ES vous donne cette flexibilité afin que vous puissiez choisir le type de données le plus efficace pour vos besoins. Pour ces fonctions, la première lettre et parfois le second après le nom de la fonction de spécifier le type de données que cette fonction attend. Voici ce que chaque suffixe se réfère à:
Ainsi, une fonction appelée glFoof() is glFoo qui attend un GLfloat d'être passé en tant qu'argument, tandis que glFoos() C'est la même fonction, mais s'attend à une GLshort. Puisque le nom des deux fonctions est identique à l'exception des lettres à la fin, vous savez que les deux appels de fonction d'accomplir exactement la même tâche.
Parfois, il ya aussi un certain nombre dans le cadre du suffixe fonction. Ce nombre représente le nombre de valeurs que la fonction attend. Ainsi, par exemple, la fonction glFoo1f() pourrait s'attendre à une seule GLfloats, tandis que glFoo2f() serait s'attendre à deux GLfloats. Les deux méthodes permettraient d'atteindre exactement la même tâche, cependant.
Certaines fonctions OpenGL ES ont un but très génériques et doivent être en mesure de prendre un nombre variable d'arguments, ou bien vous avez besoin pour passer une valeur par référence donc la fonction peut modifier la valeur d'origine. Toutes les fonctions OpenGL ES, nous avons vu jusqu'à présent s'attendre à une valeur unique par argument et ces valeurs sont passées par valeur. Cela signifie que la fonction appelée obtient sa propre copie de chaque valeur, le nombre d'arguments ne peut pas changer, et toutes les modifications apportées à ces valeurs par la méthode dite n'ont pas d'impact le code appelant. Si OpenGL a besoin de vous pour passer un pointeur en argument, soit parce qu'il doit être capable de changer la valeur, ou parce qu'il veut que vous soyez capable de passer dans un nombre indéfini d'arguments, il va ajouter une v suffixe à la fin de la soupe alphabet. Par exemple, la fonction glFoo1fv() s'attendrait-vous pour passer un pointeur à une seule GLfloat.
1 - Entremêlés d'une bibliothèque fonctionnelle avec un langage orienté-objet peut parfois conduire à des confusions. OpenGL ES a des choses qu'elle appelle des "objets", mais ils ne sont pas objet aussi loin que l'Objective-C est concerné. Habituellement, le type d'objet dont je parle sera clairement du contexte, mais quand il ne s'agit pas, je vais essayer de déterminer si «l'objet» se réfère à un objet Objective-C ou un objet OpenGL.
| Letter(s) | Pris Datatype |
|---|---|
| b | GLbyte |
| s | GLshort |
| i | GLint |
| f | GLfloat |
| ub | GLubyte |
| us | GLushort |
| ui | GLuint |
Ainsi, une fonction appelée glFoof() is glFoo qui attend un GLfloat d'être passé en tant qu'argument, tandis que glFoos() C'est la même fonction, mais s'attend à une GLshort. Puisque le nom des deux fonctions est identique à l'exception des lettres à la fin, vous savez que les deux appels de fonction d'accomplir exactement la même tâche.
Parfois, il ya aussi un certain nombre dans le cadre du suffixe fonction. Ce nombre représente le nombre de valeurs que la fonction attend. Ainsi, par exemple, la fonction glFoo1f() pourrait s'attendre à une seule GLfloats, tandis que glFoo2f() serait s'attendre à deux GLfloats. Les deux méthodes permettraient d'atteindre exactement la même tâche, cependant.
Certaines fonctions OpenGL ES ont un but très génériques et doivent être en mesure de prendre un nombre variable d'arguments, ou bien vous avez besoin pour passer une valeur par référence donc la fonction peut modifier la valeur d'origine. Toutes les fonctions OpenGL ES, nous avons vu jusqu'à présent s'attendre à une valeur unique par argument et ces valeurs sont passées par valeur. Cela signifie que la fonction appelée obtient sa propre copie de chaque valeur, le nombre d'arguments ne peut pas changer, et toutes les modifications apportées à ces valeurs par la méthode dite n'ont pas d'impact le code appelant. Si OpenGL a besoin de vous pour passer un pointeur en argument, soit parce qu'il doit être capable de changer la valeur, ou parce qu'il veut que vous soyez capable de passer dans un nombre indéfini d'arguments, il va ajouter une v suffixe à la fin de la soupe alphabet. Par exemple, la fonction glFoo1fv() s'attendrait-vous pour passer un pointeur à une seule GLfloat.
Commençons
À ce stade, vous devriez avoir une compréhension de base de l'OpenGL ES où vient et pourquoi il a été conçu de la manière dont il a été. La prochaine chose que vous devez comprendre avant de réellement le codage en OpenGL sont quelques-unes des mathématiques fondamentaux sous-jacents de programmation graphique. Ne vous inquiétez pas, nous allons commencer simple et facilité dans les maths plus complexes de sorte qu'il ne fera pas mal trop mal.1 - Entremêlés d'une bibliothèque fonctionnelle avec un langage orienté-objet peut parfois conduire à des confusions. OpenGL ES a des choses qu'elle appelle des "objets", mais ils ne sont pas objet aussi loin que l'Objective-C est concerné. Habituellement, le type d'objet dont je parle sera clairement du contexte, mais quand il ne s'agit pas, je vais essayer de déterminer si «l'objet» se réfère à un objet Objective-C ou un objet OpenGL.
Aucun commentaire:
Enregistrer un commentaire