여기는 평평한 빨간색 배경에 두 개의 직사각형, 파란색과 녹색을 그려주는 빠르고 더러운 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();
}
관련이없는 의견 : 당신은 모델 뷰 행렬에'(보기 (카메라 위치와 방향을 설정합니다)) gluLookAt'를 사용해야하고 투영 행렬이 아닙니다. 투영 행렬은 'gluPerspective','glFrustum','glOrtho' 같은 것들을 위해서만 쓰여지는데, 여러분의 투영 (카메라 렌즈)을 구성합니다. –