J'ai porté Leçon 06 NeHe. En quelque sorte.
Vous voyez, OpenGL ES 1.1 ne supporte pas les quads. NeHe choisi une pyramide et un cube, parce qu'ils sont faciles formes sous OpenGL approprié. Toutefois, le polygone seul OpenGL ES 1.1 connaît est le triangle. Il ya plusieurs variations sur elle - bandes triangle, triangle de ventilateurs, et des triangles. Comme vous l'avez vu lorsque nous avons porté Leçon 5, Nous avons dû diviser chaque quad en deux triangles. Ce n'était pas si mauvais quand nous étions juste le dessin des couleurs à plat, mais maintenant que nous sommes à la recherche de textures carte, il devient un diable ensemble de beaucoup plus difficile, parce que la cartographie d'une texture carré à un triangle est, très franchement, une douleur dans le cul.
Voici le lien pour la Leçon 6 projet porté.
Je ne cartographié deux de ses côtés - devant et le dos, l'autre ne sont pas fait et ne s'afficheront pas droit. Il m'a fallu une bonne partie de une heure avant de finalement renoncé à la cartographie des six côtés. Je déteste la publication de ce inachevé, mais je ne peux pas se permettre le bon moment maintenant pour mapper manuellement les textures à tous le triangle qui composent le cube. Heureusement, il ya rarement un besoin de mapper manuellement les coordonnées de texture plus. La plupart des programmes en 3D va exporter les coordonnées de texture pour vous, alors ensemble nous avons vraiment besoin de prendre de la leçon 06 est de savoir comment charger les textures dans la mémoire et comment les rendre actifs. Vous devriez lire le tutoriel NeHe afin de comprendre comment fonctionne mappage de texture, mais il n'a pas de sens de dépenser beaucoup de temps sur le processus. Dans une future affectation, nous allons voir comment prendre un objet 3D créé dans Blender et importer les coordonnées de texture avec les données de vertex. En pratique, il serait rare pour vous permettre de mapper manuellement les textures et les polygones individuels comme cela.
Dans la leçon 06, nous avons notre variable de première instance de la classe contrôleur. Parce que j'avais besoin d'accéder à la gamme des textures à partir de plusieurs méthodes, je ne pouvais pas juste faire une autre variable statique. Donc, nous avons maintenant un tableau d'entiers, et ces entiers sera rapportent chacune à une texture chargée dans OpenGL.
Une fois que vous avez le projet dans votre texture, on peut le charger dans notre méthode setupView:
Après cela, le reste de la configuration est à peu près les mêmes que dans le tutoriel original:
La solution est la même qu'avant - nous slideshows tous ceux coordonnées de texture dans un tableau appelé (attendre pour elle) une gamme coordonnée de texture. Les coordonnées de texture dans le tableau sont comme les valeurs que vous passeriez à glTexCoord2f () - Les valeurs entre 0,0 et 1,0. Reportez-vous au tutoriel d'origine pour une description de la façon que la cartographie fonctionne. C'est un peu difficile à Grok. Si vous n'avez pas entièrement l'obtenir, ne vous inquiétez pas - avant longtemps, nous allons écrire un objet-loader qui va gérer ça pour nous, puis nous n'aurons jamais à se rappeler comment il fonctionne à nouveau. Voici le tableau des coordonnées de texture que j'ai créé pour cette leçon, mais n'oubliez pas que seuls les 16 premières valeurs (correspondant aux quatre premiers polygones qui constituent l'avant et l'arrière du cube) sont en fait valables et cartographiées.
Avant que vous pouvez appeler glDrawElements, vous devez activer les tableaux de coordonnées de texture, en faisant cet appel:
Pour texture mapping au travail, nous devons aussi appeler
C'est à peu près tout. Lorsque nous appelons glDrawElements (), il va automatiquement chercher les données de coordonner et de carte de la texture dernière qui a été lié. Nous n'avons qu'une seule, qui nous avons lié lors de l'installation par glGenTextures appelant () et glBindTexture ().
Si nous avons eu beaucoup de textures (qui vous sera dans la plupart des situations), vous auriez normalement les charger tous en cours d'installation, puis d'activer les différents en rendant les appels ultérieurs à glBindTexture (), qui ne double devoir, à la fois la création, et en activant textures existantes. Le dernier qui a été adoptée à l'glBindTextures () est celui qui obtiendra mappé lorsque vous dessinez.
Ce fut une dure leçon au port. Ils ont opté pour cartographier le cube car il était facile - faces carrées, les textures carrées, cartographie très simple. Nous ne sommes plus chanceux sur l'iPhone, donc j'espère que vous pardonnerez le fait que celui-ci est incomplète. En retour, je promets de vous montrer comment charger des objets avec des cartes de texture. Probablement pas pour une semaine ou deux, si.
Vous voyez, OpenGL ES 1.1 ne supporte pas les quads. NeHe choisi une pyramide et un cube, parce qu'ils sont faciles formes sous OpenGL approprié. Toutefois, le polygone seul OpenGL ES 1.1 connaît est le triangle. Il ya plusieurs variations sur elle - bandes triangle, triangle de ventilateurs, et des triangles. Comme vous l'avez vu lorsque nous avons porté Leçon 5, Nous avons dû diviser chaque quad en deux triangles. Ce n'était pas si mauvais quand nous étions juste le dessin des couleurs à plat, mais maintenant que nous sommes à la recherche de textures carte, il devient un diable ensemble de beaucoup plus difficile, parce que la cartographie d'une texture carré à un triangle est, très franchement, une douleur dans le cul.
Voici le lien pour la Leçon 6 projet porté.
Je ne cartographié deux de ses côtés - devant et le dos, l'autre ne sont pas fait et ne s'afficheront pas droit. Il m'a fallu une bonne partie de une heure avant de finalement renoncé à la cartographie des six côtés. Je déteste la publication de ce inachevé, mais je ne peux pas se permettre le bon moment maintenant pour mapper manuellement les textures à tous le triangle qui composent le cube. Heureusement, il ya rarement un besoin de mapper manuellement les coordonnées de texture plus. La plupart des programmes en 3D va exporter les coordonnées de texture pour vous, alors ensemble nous avons vraiment besoin de prendre de la leçon 06 est de savoir comment charger les textures dans la mémoire et comment les rendre actifs. Vous devriez lire le tutoriel NeHe afin de comprendre comment fonctionne mappage de texture, mais il n'a pas de sens de dépenser beaucoup de temps sur le processus. Dans une future affectation, nous allons voir comment prendre un objet 3D créé dans Blender et importer les coordonnées de texture avec les données de vertex. En pratique, il serait rare pour vous permettre de mapper manuellement les textures et les polygones individuels comme cela.
Dans la leçon 06, nous avons notre variable de première instance de la classe contrôleur. Parce que j'avais besoin d'accéder à la gamme des textures à partir de plusieurs méthodes, je ne pouvais pas juste faire une autre variable statique. Donc, nous avons maintenant un tableau d'entiers, et ces entiers sera rapportent chacune à une texture chargée dans OpenGL.
GLuint texture[1]; // Storage For One Texture ( NEW )Dans notre méthode setupView, nous préparons notre texture tout comme est fait dans la leçon 06 NeHe
glGenTextures(1, &texture[0]);Nous avons pour varier un peu le plan de réalité charger la texture du fichier. Au lieu d'un fichier. Bmp, nous allons charger ce fichier texture compressée je n'avais que vous créez dans ce blogue. Si vous n'avez pas fait cela, allez faire maintenant. Vous aurez envie de glisser le fichier. Pvr4 fichier dans le groupe / Ressources de votre projet.
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Une fois que vous avez le projet dans votre texture, on peut le charger dans notre méthode setupView:
NSString *path = [[NSBundle mainBundle] pathForResource:@"NeHe" ofType:@"pvr4"];Un couple de choses à remarquer - d'abord, parce que notre image de texture est comprimé, nous avons dû utiliser glCompressedTexImage2D () plutôt que glTexImage2D () comme cela a été fait dans le tutoriel NeHe. L'autre chose est que nous publions les données d'image après que nous ayons le nourrir à OpenGL - elle crée sa propre copie de la texture, nous avons donc à libérer pour éviter une fuite de mémoire.
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
// Instead of glTexImage2D, we have to use glCompressedTexImage2D
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, 256.0, 256.0, 0, (256.0 * 256.0) / 2, [texData bytes]);
[texData release];
Après cela, le reste de la configuration est à peu près les mêmes que dans le tutoriel original:
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);Là où les choses deviennent vraiment différent est dans la méthode drawView. Certains d'entre vous avez probablement vu venir, mais nous ne pouvons pas utiliser glTexCoord2f () parce que nous ne pouvez pas utiliser glBegin () et glEnd () sur l'iPhone.
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// Enable blending
glEnable(GL_BLEND);
La solution est la même qu'avant - nous slideshows tous ceux coordonnées de texture dans un tableau appelé (attendre pour elle) une gamme coordonnée de texture. Les coordonnées de texture dans le tableau sont comme les valeurs que vous passeriez à glTexCoord2f () - Les valeurs entre 0,0 et 1,0. Reportez-vous au tutoriel d'origine pour une description de la façon que la cartographie fonctionne. C'est un peu difficile à Grok. Si vous n'avez pas entièrement l'obtenir, ne vous inquiétez pas - avant longtemps, nous allons écrire un objet-loader qui va gérer ça pour nous, puis nous n'aurons jamais à se rappeler comment il fonctionne à nouveau. Voici le tableau des coordonnées de texture que j'ai créé pour cette leçon, mais n'oubliez pas que seuls les 16 premières valeurs (correspondant aux quatre premiers polygones qui constituent l'avant et l'arrière du cube) sont en fait valables et cartographiées.
const GLfloat cubeTextureCoords[] = {
1.0, 1.0, // Front
0.0, 1.0,
0.0, 0.0,
1.0, 0.0,
0.0, 0.0, // Back
0.0, 1.0,
1.0, 1.0,
1.0, 0.0,
0.0, 0.0, // Top
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.0, 0.0, // Bottom
0.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.0, 0.0, // Left
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.0, 0.0, // Right
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
};Avant de nous faire des appels d'glDrawElements (), nous devons dire à OpenGL sur les coordonnées de texture, et nous le faisons en utilisant une fonction appelée glTexCoordPointer (), comme ceci:glTexCoordPointer(2, GL_FLOAT, 0, cubeTextureCoords);Le premier argument de cette fonction nous dit que nous avons deux valeurs de cartographie pour chaque élément puisse être établi. Le second argument indique à OpenGL que le tableau de textures contient des valeurs en virgule flottante, la troisième est que le paramètre Je continue à dire que vous ignorez et juste 0 pour offrir, et le dernier est le pointeur vers le tableau de coordonnées de texture réelle.
Avant que vous pouvez appeler glDrawElements, vous devez activer les tableaux de coordonnées de texture, en faisant cet appel:
glEnableClientState(GL_TEXTURE_COORD_ARRAY);Comme les autres fonctions permettent, vous pouvez appeler cela une fois pendant l'installation, ou vous pouvez activer et désactiver lors de l'exécution des applications. Parce que seul l'un de nos deux objets devient cartographié, nous le permettent avant de tirer le cube, et le désactiver par la suite, ce qui maintiendra la pyramide d'obtenir ainsi cartographiés.
Pour texture mapping au travail, nous devons aussi appeler
glEnable(GL_TEXTURE_2D);Ce ne doit être appelée une fois dans l'installation, ou vous pouvez également activer et le désactiver lors de l'exécution des applications, bien que généralement c'est juste allumé au début.
C'est à peu près tout. Lorsque nous appelons glDrawElements (), il va automatiquement chercher les données de coordonner et de carte de la texture dernière qui a été lié. Nous n'avons qu'une seule, qui nous avons lié lors de l'installation par glGenTextures appelant () et glBindTexture ().
Si nous avons eu beaucoup de textures (qui vous sera dans la plupart des situations), vous auriez normalement les charger tous en cours d'installation, puis d'activer les différents en rendant les appels ultérieurs à glBindTexture (), qui ne double devoir, à la fois la création, et en activant textures existantes. Le dernier qui a été adoptée à l'glBindTextures () est celui qui obtiendra mappé lorsque vous dessinez.
Ce fut une dure leçon au port. Ils ont opté pour cartographier le cube car il était facile - faces carrées, les textures carrées, cartographie très simple. Nous ne sommes plus chanceux sur l'iPhone, donc j'espère que vous pardonnerez le fait que celui-ci est incomplète. En retour, je promets de vous montrer comment charger des objets avec des cartes de texture. Probablement pas pour une semaine ou deux, si.
Aucun commentaire:
Enregistrer un commentaire