OpenGL多边形z缓冲区问题 这是一个基于Windows的快速和肮脏的基于C++的程序,它在平面红色背景下绘制两个矩形,蓝色和绿色。按“a”或“z”可使它们沿X轴在任一方向上运行。我的问题是,如果我启用GL_DEPTH_TEST,它有时会绘制一个矩形,有时两个,有时只是背景,但不会正确绘制,因为较近的多边形会遮挡较远多边形的部分或所有部分。不设置GL_DEPTH_TEST只会使多边形按图形顺序显示

OpenGL多边形z缓冲区问题 这是一个基于Windows的快速和肮脏的基于C++的程序,它在平面红色背景下绘制两个矩形,蓝色和绿色。按“a”或“z”可使它们沿X轴在任一方向上运行。我的问题是,如果我启用GL_DEPTH_TEST,它有时会绘制一个矩形,有时两个,有时只是背景,但不会正确绘制,因为较近的多边形会遮挡较远多边形的部分或所有部分。不设置GL_DEPTH_TEST只会使多边形按图形顺序显示,opengl,winapi,3d,glut,Opengl,Winapi,3d,Glut,下面的代码有什么问题 #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() {

下面的代码有什么问题

#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();
}
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“opengl32.lib”)
#pragma注释(lib,“glu32.lib”)
内倾角=0;
void oglDraw()
{
角度+=360;
角度%=360;
浮牙=角度/(180/3.14159);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glMatrixMode(GL_投影);
glLoadIdentity();
gluPerspective(90,1,0,10);
gluLookAt(0,0,-1,0,0,1,0,1,0);
浮点数yFactor=1;
浮点数zFactor=1;
浮点数y=yFactor*sin(方格);
浮点数z=1+zFactor-cos(方格)*zFactor;
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glClearColor(1,0,0,1);
glPolygonMode(GL_前端,GL_填充);
glBegin(GL_多边形);
gl4f(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);
格伦德();
方耳=(180角)/(180/3.14159);
y=-yFactor*sin(方耳);
z=1+zFactor-cos(方格)*zFactor;
glBegin(GL_多边形);
GL4F(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);
格伦德();
glFlush();
glutSwapBuffers();
}
//////////////////////////////////////////////////////////////////////////
无效oglKeyboard(字节ch,整数x,整数y)
{
如果(ch='z')
{
angle++;
再发现();
}
其他的
如果(ch='a')
{
角度--;
再发现();
}
}
//////////////////////////////////////////////////////////////////////////
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
GLUTINITWindowsSize(1024768);
glutCreateWindow(“OGL测试”);
gluOrtho2D(0,1024,768,0);
glEnable(GLU深度试验);
glutDisplayFunc(oglDraw);
glutKeyboardFunc(oglKeyboard);
glutMainLoop();
}

为的zNear传递大于零的值:


@rep_movsd:感谢您发布了一个完整的、最小的、易于编译的程序来演示这个问题。这总是让这类事情容易多了!:)这是为近z缓冲区平面和远z缓冲区平面选择正确值的一个很好的参考:不相关的注释:您应该在modelview矩阵而不是投影矩阵上使用
gluLookAt
(配置视图(相机位置和方向))。投影矩阵仅适用于
glupperspective
glFrustum
glOrtho
,它们配置了您的投影(相机镜头)。
gluPerspective(90, 1, 0.1, 10);