2010-11-18 7 views
7

私はOpenGLを学び始めました。 "OpenGL Super Bible 5 ed。"それは本当にうまくいっていると私は最初のglプログラムを自分で作成することができました!ちょうど何かシンプルな回転ピラミッド。OpenGLを学び始めて、この問題を解明するのに助けが必要です

何らかの理由で、顔の1つがレンダリングされません。私は頂点をチェックし(最初に紙にプロット)、正しいと思われました。ラインループを描くようにシェーダを変更した場合、レンダリングされます。しかし、それは三角形を描画しません。なぜ誰かが説明できますか?

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

;すべての顔を描かないのですか?またはそれらのいくつかだけ? – BeemerGuy

答えて

6

ほとんどの場合、表示されていない三角形に対しては時計回りの順序で、反時計回りの順序(通常はデフォルト)で頂点を定義しています。時計回りの巻線は本質的に内向きの法線を作り出します。したがって、カリングが有効になっているときにOpenGLでレンダリングしても問題ありません。

これを確認する最も簡単な方法は、glCullFace(GL_FRONT)を設定することです。これをトグルすると、欠落している三角形が表示され、他の3つは見えなくなります。 @loncannon;

+0

あなたは正しいです!赤い三角形を{-0.5f、0.0f、-0.5f、0.5f、0.0f、-0.5f、0.0f、0.5f、0.0f}に変更してレンダリングを開始しました。 \tありがとうございました! – Ioncannon

+0

緑色のダニであなたの好みの答えをマークすることを忘れないでください。 – Kos

6

ここでポリゴンに影響するのはglEnable(GL_CULL_FACE);です。
頂点を後ろにプロットすると、ポリゴンがレンダリングされないため、これを持ってはいけません。
削除するか、実際にはglDisable(GL_CULL_FACE);に電話してください。
あなたの場合、片側からしか見ることのできないポリゴンを描きたいとは思わないでしょう。

関連する問題