2010-11-18 31 views
7

Vì vậy, tôi đã bắt đầu học OpenGL, đọc từ cuốn sách "OpenGL Super Bible 5 ed.". Nó giải thích mọi thứ rất tốt, và tôi đã có thể tạo ra chương trình gl đầu tiên của mình! Chỉ cần một cái gì đó đơn giản, một kim tự tháp 3d quay.Bắt đầu học OpenGL, cần trợ giúp tìm ra vấn đề này

Bây giờ vì lý do nào đó, một trong các khuôn mặt không hiển thị. Tôi đã kiểm tra các vertecies (vẽ nó trên giấy đầu tiên) và nó có vẻ là đúng. Phát hiện ra nếu tôi thay đổi đổ bóng để vẽ một vòng lặp dòng, nó sẽ render. Tuy nhiên nó sẽ không làm cho một tam giác. Bất cứ ai có thể giải thích lý do tại sao?

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; làm tất cả các khuôn mặt không vẽ? Hay chỉ một vài người trong số họ? – BeemerGuy

Trả lời

6

Bạn có nhiều khả năng đã xác định các đỉnh theo thứ tự theo chiều kim đồng hồ cho hình tam giác không hiển thị và theo thứ tự ngược chiều kim đồng hồ (thường là mặc định) cho những thứ có. Theo chiều kim đồng hồ quanh co tạo ra một mặt đối mặt bình thường và do đó OpenGL sẽ không bận tâm để render nó khi culling được kích hoạt.

Cách dễ nhất để kiểm tra điều này là đặt glCullFace(GL_FRONT) - điều này sẽ chuyển đổi nó để bạn thấy hình tam giác bị thiếu và không còn nhìn thấy tam giác còn lại.

+0

Bạn chính xác! Thay đổi tam giác màu đỏ thành {-0,5f, 0,0f, -0,5f, 0,5f, 0,0f, -0,5f, 0,0f, 0,5f, 0,0f} và bắt đầu hiển thị! \t Thankyou! – Ioncannon

+0

Hãy nhớ đánh dấu câu trả lời yêu thích của bạn bằng dấu màu lục. – Kos

6

Điều duy nhất tôi thấy ảnh hưởng đến đa giác ở đây là glEnable(GL_CULL_FACE);.
Bạn không nên có điều đó, bởi vì nếu bạn vẽ các đỉnh của bạn về phía sau, đa giác sẽ không hiển thị.
Xóa hoặc thực sự gọi glDisable(GL_CULL_FACE); để đảm bảo.
Trong trường hợp của bạn, có khả năng bạn không muốn vẽ đa giác mà bạn chỉ có thể nhìn thấy từ một phía.

Các vấn đề liên quan