2010-11-18 15 views
7

Bu yüzden OpenGL öğrenmeye başladım, "OpenGL Super Bible 5 ed." Bu gerçekten iyi şeyler açıklıyor ve ilk gl programımı kendim oluşturabiliyorum! Sadece basit bir şey, dönen bir 3d piramit.OpenGL'yi öğrenmeye başladığınızda, bu sorunu çözmede yardıma ihtiyacınız var.

Bazı nedenlerden dolayı yüzlerden biri oluşturulamıyor. Doğruluğu kontrol ettim (önce kağıda çizdim) ve doğru görünüyordu. Bir çizgi döngü çizmek için gölgelendiriciyi değiştirdiğimi fark ettim, bu olur. Ancak bir üçgen oluşturmaz. Nedenini açıklayan var mı?

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; tüm yüzler çizmiyor mu? Ya da sadece bazıları? – BeemerGuy

cevap

6

Büyük ihtimalle, görünmeyen üçgenin saat yönüne göre ve saat yönünün tersine (normalde varsayılan) olanlar için dikey olarak tanımlamışsınızdır. Saat yönünde sarım, aslında içe dönük bir normal oluşturur ve bu nedenle OpenGL, itme etkin olduğunda bunu oluşturmak için uğraşmaz.

Bunu denetlemenin en kolay yolu, glCullFace(GL_FRONT) ayarını yapmaktır. Bu, geçiş üçgeni görmeniz ve diğer üçünü görmemesi için geçiş yapması gerekir.

+0

Haklısınız! Kırmızı üçgeni {-0.5f, 0.0f, -0.5f, 0.5f, 0.0f, -0.5f, 0.0f, 0.5f, 0.0f} olarak değiştirin ve oluşturmaya başladı! \t Teşekkür ederim! – Ioncannon

+0

Favori cevabınızı yeşil onay işaretiyle işaretlemeyi unutmayın. – Kos

6

Ben burada çokgenler etkilediğini görmek için tek şey glEnable(GL_CULL_FACE); olduğunu.
Bunu yapmamalısınız, çünkü köşelerinizi geriye doğru çizerseniz, çokgen oluşmaz.
Alın ya da aslında emin olmak için glDisable(GL_CULL_FACE); numaralı telefonu arayın.
Sizin durumunuzda, sadece bir taraftan görebileceğiniz bir çokgen çizmek isteyebilirsiniz.

İlgili konular