2010-11-18 4 views
7

J'ai donc commencé à apprendre OpenGL, en lisant le livre "OpenGL Super Bible 5 ed.". Cela explique très bien les choses, et j'ai pu créer mon premier programme gl moi-même! Juste quelque chose de simple, une pyramide 3D tournante.Commencé à apprendre OpenGL, besoin d'aide pour résoudre ce problème

Maintenant, pour une raison quelconque, l'une des faces n'est pas rendue. J'ai vérifié les vertecies (tracé sur le papier d'abord) et il a semblé être juste. Découvert si j'ai changé le shader pour dessiner une boucle de ligne, il rendrait. Cependant, cela ne rendrait pas un triangle. Quelqu'un peut-il expliquer pourquoi?

void setupRC() 
{ 
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

shaderManager.InitializeStockShaders(); 

M3DVector3f vVerts1[] = {-0.5f,0.0f,-0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,-0.5f}; 

M3DVector3f vVerts2[] = {-0.5f,0.0f,-0.5f,0.0f,0.5f,0.0f,-0.5f,0.0f,0.5f}; 
    M3DVector3f vVerts3[] = {-0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,0.5f}; 
M3DVector3f vVerts4[] = {0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,-0.5f}; 



triangleBatch1.Begin(GL_LINE_LOOP, 3); 
triangleBatch1.CopyVertexData3f(vVerts1); 
triangleBatch1.End(); 

triangleBatch2.Begin(GL_TRIANGLES, 3); 
triangleBatch2.CopyVertexData3f(vVerts2); 
triangleBatch2.End(); 
triangleBatch3.Begin(GL_TRIANGLES, 3); 
triangleBatch3.CopyVertexData3f(vVerts3); 
triangleBatch3.End(); 
triangleBatch4.Begin(GL_TRIANGLES, 3); 
triangleBatch4.CopyVertexData3f(vVerts4); 
triangleBatch4.End(); 

glEnable(GL_CULL_FACE); 
} 

float rot = 1; 

void renderScene() 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

GLfloat vRed[] = {1.0f, 0.0f, 0.0f, 0.5f}; 
GLfloat vBlue[] = {0.0f, 1.0f, 0.0f, 0.5f}; 
GLfloat vGreen[] = {0.0f, 0.0f, 1.0f, 0.5f}; 
GLfloat vWhite[] = {1.0f, 1.0f, 1.0f, 0.5f}; 

M3DMatrix44f transformMatrix; 

if (rot >= 360) 
    rot = 0; 
else 
    rot = rot + 1; 

m3dRotationMatrix44(transformMatrix,m3dDegToRad(rot),0.0f,1.0f,0.0f); 

shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vRed); 
triangleBatch1.Draw(); 
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vBlue); 
triangleBatch2.Draw(); 
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vGreen); 
triangleBatch3.Draw(); 
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vWhite); 
triangleBatch4.Draw(); 

glutSwapBuffers(); 
glutPostRedisplay(); 
Sleep(10); 
} 
+0

@ loncannon; Est-ce que tous les visages ne dessinent pas? Ou juste certains d'entre eux? – BeemerGuy

Répondre

6

Vous avez probablement défini les sommets dans le sens des aiguilles d'une montre pour le triangle qui ne s'affiche pas, et dans le sens inverse des aiguilles d'une montre (normalement par défaut) pour ceux qui le sont. L'enroulement dans le sens des aiguilles d'une montre crée essentiellement une normale orientée vers l'intérieur et ainsi OpenGL ne prendra pas la peine de le rendre lorsque l'abattage est activé. La méthode la plus simple pour vérifier cela est de régler glCullFace(GL_FRONT) - qui devrait basculer pour que vous voyiez le triangle manquant et ne plus voir les trois autres.

+0

Vous avez raison! Changer le triangle rouge à {-0.5f, 0.0f, -0.5f, 0.5f, 0.0f, -0.5f, 0.0f, 0.5f, 0.0f} et il a commencé à rendre! \t Merci! – Ioncannon

+0

N'oubliez pas de marquer votre réponse préférée avec la coche verte. – Kos

6

La seule chose que je vois qui affecte les polygones ici est glEnable(GL_CULL_FACE);.
Vous ne devriez pas avoir cela, parce que si vous tracez vos vertices en arrière, le polygone ne sera pas rendu.
Retirez-le ou appelez effectivement glDisable(GL_CULL_FACE); pour être sûr.
Dans votre cas, il est peu probable que vous souhaitiez dessiner un polygone que vous pouvez voir d'un seul côté.

Questions connexes