【发布时间】: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(它配置您的视图(相机位置和方向))。投影矩阵仅适用于gluPerspective、glFrustum和glOrtho之类的东西,它们可以配置您的投影(相机镜头)。