2010-07-23 4 views
0

여기는 평평한 빨간색 배경에 두 개의 직사각형, 파란색과 녹색을 그려주는 빠르고 더러운 GLUT 기반 C++ 프로그램입니다. 'a'또는 'z'를 누르면 X 축을 따라 어느 한 방향으로 궤도가 이동합니다. 내 문제는 내가 GL_DEPTH_TEST를 활성화하면 가끔은 하나의 사각형, 때로는 두 개 또는 때로는 배경을 그렸지만, 멀리있는 폴리곤이 더 멀리있는 부분의 일부 또는 전부를 왜곡하여 정확하게 그려 내지 못한다는 것입니다. GL_DEPTH_TEST를 설정하지 않으면 폴리곤이 드로잉 순서로 나타납니다.OpenGL 다각형 z 버퍼 문제

아래 코드에 어떤 문제가 있습니까? gluPerspective()의 zNear에 0보다 큰

#include <windows.h> 

#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

#include <cmath> 

#pragma comment(lib, "opengl32.lib") 
#pragma comment(lib, "glu32.lib") 

int angle = 0; 

void oglDraw() 
{ 
    angle += 360; 
    angle %= 360; 
    float fAngle = angle/(180/3.14159); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    gluPerspective(90, 1, 0, 10); 
    gluLookAt(0, 0, -1, 0, 0, 1, 0, 1, 0); 

    float yFactor = 1; 
    float zFactor = 1; 
    float y = yFactor * sin(fAngle); 
    float z = 1 + zFactor - cos(fAngle) * zFactor; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glClearColor(1, 0, 0, 1); 

    glPolygonMode(GL_FRONT, GL_FILL); 

    glBegin(GL_POLYGON); 
    glColor4f(0, 0, 1, 1); 
    glVertex3f(-1.0, y-1.0, z); 
    glVertex3f(+1.0, y-1.0, z); 
    glVertex3f(+1.0, y+1.0, z); 
    glVertex3f(-1.0, y+1.0, z); 
    glEnd(); 

    fAngle = (180 - angle)/(180/3.14159); 
    y = -yFactor * sin(fAngle); 
    z = 1 + zFactor - cos(fAngle) * zFactor; 

    glBegin(GL_POLYGON); 
    glColor4f(0, 1, 0, 1); 
    glVertex3f(-1.0, y-1.0, z); 
    glVertex3f(+1.0, y-1.0, z); 
    glVertex3f(+1.0, y+1.0, z); 
    glVertex3f(-1.0, y+1.0, z); 
    glEnd(); 

    glFlush(); 
    glutSwapBuffers(); 
} 
////////////////////////////////////////////////////////////////////////// 

void oglKeyboard(byte ch, int x, int y) 
{ 
    if(ch == 'z') 
    { 
     angle++; 

     glutPostRedisplay(); 

    } 
    else 
    if(ch == 'a') 
    { 
     angle--; 

     glutPostRedisplay(); 
    } 
} 
////////////////////////////////////////////////////////////////////////// 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(1024, 768); 
    glutCreateWindow("OGL test"); 
    gluOrtho2D(0, 1024, 768, 0); 

    glEnable(GL_DEPTH_TEST); 
    glutDisplayFunc(oglDraw); 
    glutKeyboardFunc(oglKeyboard); 

    glutMainLoop(); 
} 
+0

관련이없는 의견 : 당신은 모델 뷰 행렬에'(보기 (카메라 위치와 방향을 설정합니다)) gluLookAt'를 사용해야하고 투영 행렬이 아닙니다. 투영 행렬은 'gluPerspective','glFrustum','glOrtho' 같은 것들을 위해서만 쓰여지는데, 여러분의 투영 (카메라 렌즈)을 구성합니다. –

답변

1

패스 뭔가 :

gluPerspective(90, 1, 0.1, 10); 
+0

절대적으로 옳습니다! 고마워, 나는 지난 몇 시간 동안 내 머리를 찢어 버렸어 !! –

+0

@rep_movsd : 문제를 보여주는 완전한 최소한의 컴파일하기 쉬운 프로그램을 게시 해 주셔서 감사합니다. 그것은 항상 이런 종류의 일을 많이 * 더 쉽게 만듭니다! :) – genpfault

+2

이것은 근거리 및 원거리 Z- 버퍼 평면에 적합한 값을 선택하는 데 좋은 참조입니다. http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html –