vendredi 3 février 2012

Un peu d'aide

Je vais avoir un problème avec OpenGL ES, et c'est moi maintenant de terminer mon message moteur de particules. J'espérais que quelqu'un ici pourrait voir ce que je fais. Voici le code que je dois dessiner une particule de mappage de texture. Cette version utilise GL_TRIANGLES et glDrawArrays (), mais j'ai eu des problèmes similaires à l'aide GL_TRIANGLE_STRIP et glDrawElements () ..

    case ParticleEmitter3DDrawTextureMap:
{
static const GLfloat squareStrip[18] = {
+0.01f, +0.01f, +0.0f,
-0.01f, +0.01f, +0.0f,
-0.01f, -0.01f, +0.0f,

+0.01f, +0.01f, +0.0f,
-0.01f, -0.01f, +0.0f,
+0.01f, -0.01f, +0.0f,
};
static const GLfloat tex[12] = {

1.0, 1.0,
0.0, 1.0,
0.0, 0.0,

1.0, 1.0,
0.0, 0.0,
1.0, 0.0,
};

//static const GLfloat squareNormals[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};

glScalef(oneParticle->particleSize, oneParticle->particleSize, oneParticle->particleSize);

[texture bind];
glEnable(GL_TEXTURE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, squareStrip);
//glNormalPointer(GL_FLOAT, 0, squareNormals);
glTexCoordPointer(3, GL_FLOAT, 0, tex);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisable(GL_TEXTURE);
//glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
break;
}

Comme un test, j'ai été cartographie de cette image sur les sprites:

Mais, ce que je reçois est le suivant:

Ma conjecture, il s'agit soit d'un problème de coordonnées de texture ou d'une question de fonction de mélange. J'ai essayé beaucoup, beaucoup de permutations, les deux avec des bandes de triangle et des triangles, et en utilisant glDrawArrays () et glDrawElements (), et j'ai essayé toutes les permutations des coordonnées de texture je peux penser, et pourtant je n'ai jamais été en mesure d'obtenir deux triangles mappé droite.

Voici une version légèrement différente qui donne le même résultat:
            case ParticleEmitter3DDrawTextureMap:
{
static const GLfloat squareVertices[12] = {
+0.01f, +0.01f, +0.0f,
-0.01f, +0.01f, +0.0f,
-0.01f, -0.01f, +0.0f,
+0.01f, -0.01f, +0.0f,
};
static const GLfloat tex[8] = {
1.0, 0.0,
0.0, 1.0,
0.0, 0.0,
1.0, 0.0,
};
static const GLushort triangle1[3] = {0,2,1};
static const GLushort triangle2[3] = {2,3,0};

//static const GLfloat squareNormals[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};

glScalef(oneParticle->particleSize, oneParticle->particleSize, oneParticle->particleSize);

[texture bind];
glEnable(GL_TEXTURE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, squareVertices);
//glNormalPointer(GL_FLOAT, 0, squareNormals);
glTexCoordPointer(3, GL_FLOAT, 0, tex);
//glDrawArrays(GL_TRIANGLES, 0, 6);

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, &triangle1);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, &triangle2);
glDisable(GL_TEXTURE);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
break;
}

La chose est, je sais que ces coordonnées de texture sont de droite. J'ai copié textuellement les coordonnées et le code de dessin à partir des exemples de code probablement une demi-douzaine de tutoriels que j'ai trouvé sur le web. Cela, combiné avec le fait que je ne peux pas trouver un ensemble de coordonnées de texture qui fonctionne, me rend chose que je fais quelque chose de terriblement mal ailleurs. J'ai essayé de commutation de l'ordonnance de liquidation des sommets triangle, et qui n'avait aucun effet visible. J'ai aussi joué avec les fonctions de mélange, sans succès.

S'il ya quelqu'un là-bas qui est très bon avec OpenGL qui peuvent signaler la chose crétin que je fais ici, je l'apprécie vraiment. Je pense que c'est possible que c'est la même chose qui m'a été empêche d'obtenir les fichiers OBJ UV-mappé pour afficher correctement.

Si vous êtes la première personne à comprendre ce que je fais mal, vous êtes les bienvenus pour une copie gratuite de début de développement iPhone, mais si vous pouvez comprendre cela, vous avez probablement pas besoin d'elle. Malheureusement, je ne peux pas se permettre de dépenser plus de temps sur ce droit maintenant, donc à moins que quelqu'un peut comprendre cela, le tutoriel de particules va probablement aller sur une étagère pendant quelques semaines alors que je creuse à partir du carnet de Macworld.

Aucun commentaire: