0
J'ai le code suivant, mais je ne trouve pas le bogue. Cela semble être un problème lié à la mémoire. Le code original provient de la librairie 3d qui vient avec l'OpenGL, et j'essaie de l'adapter pour openGL es. Des idées sur les raisons pour lesquelles ça segmente tout le temps?Aide pour dessiner une sphère dans OpenGL ES
- (void)drawSphereOfRadius:(GLfloat)fRadius nbSlices:(GLint)iSlices nbStacks:(GLint)iStacks
{
GLfloat *vertexPointer = malloc(sizeof(GLfloat) * iStacks * iSlices * 3 * 2);
GLfloat drho = (GLfloat)(3.141592653589)/(GLfloat) iStacks;
GLfloat dtheta = 2.0f * (GLfloat)(3.141592653589)/(GLfloat) iSlices;
GLfloat ds = 1.0f/(GLfloat) iSlices;
GLfloat dt = 1.0f/(GLfloat) iStacks;
GLfloat t = 1.0f;
GLfloat s = 0.0f;
GLint i, j; // Looping variables
int idx = 0;
for (i = 0; i < iStacks; i++)
{
GLfloat rho = (GLfloat)i * drho;
GLfloat srho = (GLfloat)(sin(rho));
GLfloat crho = (GLfloat)(cos(rho));
GLfloat srhodrho = (GLfloat)(sin(rho + drho));
GLfloat crhodrho = (GLfloat)(cos(rho + drho));
s = 0.0f;
for (j = 0; j <= iSlices; j++)
{
GLfloat theta = (j == iSlices) ? 0.0f : j * dtheta;
GLfloat stheta = (GLfloat)(-sin(theta));
GLfloat ctheta = (GLfloat)(cos(theta));
GLfloat x = stheta * srho;
GLfloat y = ctheta * srho;
GLfloat z = crho;
glNormal3f(x, y, z);
vertexPointer[idx] = x * fRadius;
vertexPointer[idx + 1] = y * fRadius;
vertexPointer[idx + 2] = z * fRadius;
x = stheta * srhodrho;
y = ctheta * srhodrho;
z = crhodrho;
s += ds;
glNormal3f(x, y, z);
vertexPointer[idx + 3] = x * fRadius;
vertexPointer[idx + 4] = y * fRadius;
vertexPointer[idx + 5] = z * fRadius;
idx += 6;
}
t -= dt;
}
glVertexPointer(3, GL_FLOAT, 0, vertexPointer);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, iStacks * iSlices * 2);
free(vertexPointer);
//glPopMatrix();
}
Eh bien, il a arrêté de segfaulting, mais il tire toujours mal. Je vais travailler dessus. –
Bien pour commencer vos appels à 'glNormal3f' continuent à changer la normale actuelle, mais vous n'êtes pas jusqu'à la commande' glDrawArrays'. Il utilisera la dernière normale que vous avez définie pour tous les sommets. En ce qui concerne les vertices, vous semblez essayer de générer une bande triangulaire, mais ce n'est pas ainsi que vous avez configuré votre vertex buffer. Plutôt que d'essayer de résoudre ce problème, vous pouvez générer un tampon d'index pour votre bande triangulaire afin de sauvegarder la répétition de tous les sommets de l'itération précédente, c'est-à-dire créer un tampon de vertex qui contient chaque vertex une seule fois. Le tampon d'index est un tableau d'indices dans ce tampon de vertex. – Troubadour
Désolé, ce dernier commentaire devrait indiquer "... mais vous ne _drawing_ jusqu'à la commande' glDrawArrays'. " – Troubadour