OpenGL-反剔除-深度缓冲区值

OpenGL-反剔除-深度缓冲区值,opengl,depth-buffer,Opengl,Depth Buffer,这里有两张相同3D场景的图像,分别来自同一视角(虚拟摄影机),有无背景剔除。这些图像并不描绘最终的网格,而是深度缓冲区的内容 不进行反剔除 glDisable(GL_CULL_FACE); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); glDepthFunc(GL_LESS); glEnable(GL_CULL_FACE); glPolygonMode(GL_F

这里有两张相同3D场景的图像,分别来自同一视角(虚拟摄影机),有无背景剔除。这些图像并不描绘最终的网格,而是深度缓冲区的内容

不进行反剔除

glDisable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);

带回选功能

glDisable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);

问题

  • 为什么这两幅图像之间有如此大的差异?当然,人们会期望有不同,但我不明白为什么不进行反剔除,深度贴图会如此平滑,而进行反剔除,深度值似乎不会如此连续
  • 在没有反剔除的情况下,对于某个像素,深度缓冲区的值是多少?它是离相机更近的那个(平滑图像看起来像这样),还是因为很多东西都投射到同一个2d点/像素,我应该期待其他东西
  • 参考-三维场景-二维帧


    它们之所以不同,是因为你剔除了错误的面孔。网格数据方向清晰,因此正面不同于OpenGL的默认值。OpenGL默认为逆时针方向为正。网格数据将顺时针面放在前面(或者在某个点反转网格)


    因此,与其重新排列顶点数据,不如使用更改正面。

    它们是不同的,因为您剔除了错误的面。网格数据方向清晰,因此正面不同于OpenGL的默认值。OpenGL默认为逆时针方向为正。网格数据将顺时针面放在前面(或者在某个点反转网格)


    因此,不必重新排列顶点数据,而是使用更改正面。

    事实上@Nicolas,通过检查网格,后表面顶点具有相似的深度(与前表面顶点相比),但我没有想到您的建议。非常感谢,它很有效!刚刚在我上面提到的代码行上方添加了建议的命令:)还要注意,您也可以使用glCullFace。这会改变你是剔除正面还是背面(或者两者都剔除)。事实上@Nicolas,通过检查网格,背面顶点具有相似的深度(与正面顶点相比),但我没有想到你的建议。非常感谢,它很有效!刚刚在我上面提到的代码行上方添加了建议的命令:)还要注意,您也可以使用glCullFace。这将更改是否剔除正面或背面(或两者)。