【问题标题】:OpenGL polygon z buffer problemOpenGL多边形z缓冲区问题
【发布时间】:2010-07-23 17:36:58
【问题描述】:

这是一个快速而肮脏的基于 GLUT 的 C++ 程序,用于在平坦的红色背景上绘制两个矩形,蓝色和绿色。按“a”或“z”使它们沿 X 轴在任一方向运行。我的问题是,如果我启用 GL_DEPTH_TEST,它有时会绘制一个矩形,有时会绘制两个或有时只是背景,但永远不会正确地使用较近的多边形遮挡较远的多边形的部分或全部部分。不设置 GL_DEPTH_TEST 只会使多边形出现在绘制顺序中。

下面的代码有什么问题?

#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(它配置您的视图(相机位置和方向))。投影矩阵仅适用于 gluPerspectiveglFrustumglOrtho 之类的东西,它们可以配置您的投影(相机镜头)。

标签: opengl winapi 3d glut


【解决方案1】:

gluPerspective() 的zNear 传递大于零的值:

gluPerspective(90, 1, 0.1, 10);

【讨论】:

  • @rep_movsd:感谢您发布一个完整的、最小的、易于编译的程序来演示该问题。这总是让这类事情非常变得更容易! :)
  • 这是为近和远 z 缓冲平面选择正确值的一个很好的参考:sjbaker.org/steve/omniv/love_your_z_buffer.html
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多