Tho*_*oub 0 c++ opengl 3d depth
我用OpenGL它在屏幕上绘制一些内容.
这是初始化:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 10, -10);
glMatrixMode(GL_MODELVIEW);
Run Code Online (Sandbox Code Playgroud)
然后我使用这个绘制对象:
void draw(...)
{
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBegin(GL_QUADS); //Begining the cube's drawing
{
glTexCoord3f(tu1, tv1, 1); glVertex3f(offset, _y, _z);
glTexCoord3f(tu2, tv1, 1); glVertex3f(offset + w, _y, _z);
glTexCoord3f(tu2, tv2, 1); glVertex3f(offset + w, _y + h, _z);
glTexCoord3f(tu1, tv2, 1); glVertex3f(offset, _y + h, _z);
}
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
}
Run Code Online (Sandbox Code Playgroud)
但深度不受尊重(用很多_z值测试).它随着呼叫的顺序而变化,越近将是最后绘制的.
如果我先画出粉红色条:

如果我在奶油条后绘制粉红色条:

当您看到画家的算法(最后一个对象出现在前面)时,这意味着深度缓冲区存在问题.在您的情况下,您需要启用深度测试和写入以及初始化(默认情况下它是关闭的):
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)
您还需要在每个帧的开头清除深度缓冲区(清除颜色缓冲区通常也是一个好主意):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
看看OpenGL wiki对深度缓冲的看法.