【发布时间】:2020-10-17 15:27:53
【问题描述】:
深度缓冲区工作正常,直到我添加了天空盒,现在它隐藏了我所有的世界(场景)并且只在 hiddenDepth=False 时渲染天空盒... 问题显然是天空盒,因为我通过删除天空盒来检查它......
下方显示功能
static void display()
{
if (hiddenDepth)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
else {
glClear(GL_COLOR_BUFFER_BIT);
}
glPushMatrix();
glScalef(15500, 15500, 15500);
glTranslatef(0,0.5, 0);
drawskybox();
glPopMatrix();
glScalef(40, 40, 40);
drawWorld();
}
这是我的天空盒
glPushMatrix();
glPushAttrib(GL_ENABLE_BIT);
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glDisable(GL_BLEND);
// Render the quad
glPopAttrib();
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glEnable(GL_BLEND);
glPopMatrix();
}
隐藏的深度调用(true,false on key press)
if (hiddenDepth)
{
// Now do z buffer
glEnable(GL_DEPTH_TEST);
glDepthRange(nearPlane,farPlane);
glClearDepth(farPlane);
}
初始化图形
static void initGraphics (void)
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
主要功能
int main (int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
glutInitWindowSize(550, 550);
glutInitWindowPosition(100, 75);
glutCreateWindow("Cube");
initGraphics();
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutKeyboardFunc(asciiKey);
glutSpecialFunc(specialKey);
glutIdleFunc(idleRoutine);
glutTimerFunc(timerMSecs,timer,0);
glutMainLoop();
/* Should never get here, but keeps compiler happy */
return 0;
}
【问题讨论】:
-
抱歉,我在这段代码中看不到任何明显的问题。先绘制天空盒,绘制sybox时始终禁用深度测试。
-
感谢您的回复 :) 我也在想是什么问题 :(
-
最后画天空盒怎么样?有什么建议吗?
-
我建议在您的应用程序中找到错误。一般来说,您的方法是正确的。如果它不起作用,则说明您的应用程序中存在错误。无论如何你可以在最后绘制天空盒深度测试必须启用,深度功能必须是
GL_LEQUAL(glDepthFunc(GL_LEQUAL))并且你必须绘制z坐标为1.0的天空盒。矩阵必须是恒等矩阵(GL_MODELVIEW和GL_PROJECTION)。 -
我会试试的,谢谢
标签: opengl depth-buffer skybox depth-testing