代码之家  ›  专栏  ›  技术社区  ›  rep_movsd

OpenGL多边形Z缓冲问题

  •  0
  • rep_movsd  · 技术社区  · 16 年前

    这里是一个快速和肮脏的基于GLUT的C++程序,它在平面红色背景下绘制两个矩形,蓝色和绿色。按“a”或“z”使它们沿x轴在任一方向上运行。我的问题是,如果我启用gl_深度测试,它有时会绘制一个矩形,有时绘制两个,有时只绘制背景,但从不正确地使用较近的多边形模糊较远的部分或所有部分。不设置gl_深度测试只会使多边形按绘图顺序显示。

    下面的代码有什么问题?

    #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();
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   genpfault    16 年前

    传递大于零的东西 gluPerspective() ZeNe:

    gluPerspective(90, 1, 0.1, 10);