2012-11-08 3 views
3

간단한 셀 쉐이더 효과를 만들기 위해 노력 중이며 후면 및 전면면 컬링이 포함됩니다. 그러나 지금까지 나의 도태 결과는 다소 이상합니다.이상한 결과를 초래하는 OpenGL 백 페이스 컬링

설정 OpenGL을 소스 코드 : 소스 코드를 렌더링

// init matrices 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(45, 800/600, 0.01f, 150); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
// enable opengl caps 
glEnable(GL_NORMALIZE); 
glEnable(GL_CULL_FACE); 
// cell shading effects 
glLineWidth(3.5f); 
// setup display list 
pDList = glGenLists(1); 
glNewList(pDList, GL_COMPILE); 
    glBegin(GL_QUADS); 
     // front 
     glNormal3f(0, 0, 1); 
     glVertex3f(-0.25f, -0.5f, -3); 
     glVertex3f(0.25f, -0.5f, -3); 
     glVertex3f(0.25f, -1, -3); 
     glVertex3f(-0.25f, -1, -3); 
     // back 
     glNormal3f(0, 0, -1); 
     glVertex3f(-0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -1, -3.5f); 
     glVertex3f(-0.25f, -1, -3.5f); 
     // top 
     glNormal3f(0, 1, 0); 
     glVertex3f(-0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -0.5f, -3); 
     glVertex3f(-0.25f, -0.5f, -3); 
     // bottom 
     glNormal3f(0, -1, 0); 
     glVertex3f(-0.25f, -1, -3.5f); 
     glVertex3f(0.25f, -1, -3.5f); 
     glVertex3f(0.25f, -1, -3); 
     glVertex3f(-0.25f, -1, -3); 
     // right 
     glNormal3f(1, 0, 0); 
     glVertex3f(0.25f, -0.5f, -3); 
     glVertex3f(0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -1, -3.5f); 
     glVertex3f(0.25f, -1, -3); 
     // left 
     glNormal3f(-1, 0, 0); 
     glVertex3f(-0.25f, -0.5f, -3); 
     glVertex3f(-0.25f, -0.5f, -3.5f); 
     glVertex3f(-0.25f, -1, -3.5f); 
     glVertex3f(-0.25f, -1, -3); 
    glEnd(); 
glEndList(); 

가 :

enter image description here

은 어떤 이유로 단지 권리를 그리는 것 :

// clear 
glClear(GL_COLOR_BUFFER_BIT); 
glClearColor(0.75f, 0.75f, 0.75f, 1); 
// reset matrix 
glLoadIdentity(); 
// draw cube 
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
glCullFace(GL_BACK); 
glColor3i(0, 0, 0); 
glCallList(pDList); 

이것은 내가 가진 무엇 큐브 쪽. 기묘한. glCullFace (GL_BACK)를 변경했습니다. ~ glCullFace (GL_FRONT); 내 렌더링 기능.

enter image description here

지금은 모든 측면을 그리는 것 : 나는이있어? 입방체의 오른쪽은 뒤쪽과 앞면 모두이며, 나머지 큐브는 뒤쪽을 향하고 있다고 생각하는 것 같습니다. 도둑질을 할 때 위의 그림과 같은 결과가 나타납니다.

내가 생각할 수있는 다른 관련 정보는 내가 SDL을 사용하고 있으며 그래픽 카드 문제가 아니라고 확신합니다. 두 개의 다른 컴퓨터에서 실행 했으므로 각각 동일한 결과를 산출했습니다. 결과.

방금 ​​원시를위한 법선을 설정하는 법을 배우기 시작 했으므로 이것은 큰 n00b 실수 또는 약간의 멍청한 오류입니다. 나는 가장 단순하고 분명한 실수를 할 때마다 1 페니를 챙기고 백만 시간 동안 붙어있어 백만장자가 될 것입니다.

간단히 말해서, 내가 잘못한 것은 무엇이고, 올바른 방향으로 올바른면을 잡아서 올바른 방향으로 도려내는 방법은 무엇입니까?

+0

내 OpenGL 초기화 코드가 약간 녹슬었지만 정점 (GL_CW, GL_CCW)의 순서를 어딘가에 정의해서는 안됩니까? – MFH

+0

그게 무슨 의미인지 아직 모르겠다. 나는 여전히 OpenGL을 배우고있다 ... – Aaron

+0

명백하게 Sergey K는 같은 생각을 가지고 있었지만, 더 좋은 방법으로 그것을 제시 할 수 있었다 :) – MFH

답변

4

마이너스 - 노멀의 벡터에서 각 삼각형을 보면 시계 방향 또는 반 시계 방향으로 정점이 지정된 순서 (winding)를 정의 할 수 있습니다.

컬링 작업을 올바르게 수행하려면 모든 버텍스를 CW 또는 CCW 와인딩에 지정해야합니다.

+0

고마워, 지금은 잘 작동한다! – Aaron