2010-07-23 153 views
0

这是一个基于GLUT的快速和肮脏的C++程序,用于绘制两个长方形的平面红色背景上的蓝色和绿色的C++程序。按'a'或'z'使它们沿着X轴在任一方向上进行轨道运动。我的问题是,如果我启用GL_DEPTH_TEST,它有时绘制一个矩形,有时是两个或有时只是背景,但从未正确使用较近的多边形遮蔽较远一个的一些或全部部分。不设置GL_DEPTH_TEST只是使多边形以绘图顺序显示。OpenGL多边形z缓冲区问题

下面的代码有什么问题?

#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这样的配置您的投影(摄像机镜头)。 – 2011-05-23 14:09:57

回答

1

gluPerspective()的zNear通行证的东西大于零:

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

绝对正确! 谢谢,我在过去的几个小时里一直在扯我的头发! – 2010-07-23 19:57:22

+0

@rep_movsd:感谢您发布了一个完整的,最简单的,易于编译的程序来演示问题。这总是让这类事情变得更容易! :) – genpfault 2010-07-23 20:18:22

+2

这是一个很好的参考选择正确的价值近远Z缓冲飞机:http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html – 2010-07-24 05:59:44