我一直在使用 OpenGL (JOGL) 中的深度缓冲区,通过禁用深度缓冲区来确保某些项目呈现在其他项目之前(在我之前的问题 Java OpenGL saving depth buffer 中有详细说明)。
这是有效的,除了当我设置禁用深度测试时正在绘制的项目的颜色时,没有任何 Material 光泽显示出来。该项目呈现为原始颜色的较暗版本(似乎没有真正应用于它的照明效果)。为什么会发生这种情况?我该如何防止这种情况发生?
谢谢, 杰夫
最佳答案
由于到目前为止您还没有得到答案,我会尽力而为,尽管我在这里真的有点猜测。
我能想到的几个原因,为什么你看到的效果会发生:
与照明模型的环境和漫反射组件相比,镜面反射组件需要考虑眼睛相对于物体和光源的位置。所以当 OpenGL 使用深度缓冲区时,这可能会更快。我假设,这种方式 - 对于要绘制的每个像素 - 它可以使用深度值来完成具有 z 分量的眼睛坐标。
也许跟光衰也有关系?当使用光衰减时,OpenGL 会计算光在到达您的眼睛之前必须经过的距离(或者它是否通过仅计算光与物体之间的距离来简化?我不确定。)
所以我假设,没有深度缓冲就不可能正确使用光照。我想你在另一篇文章中提到过,你不能只清除深度缓冲区,因为它会干扰应用程序的其余部分?我认为应该有一个模板解决方案,类似于 http://www.glprogramming.com/red/chapter10.html 中的“示例 10-1:使用模板测试”。 (它是用 C 语言编写的,但我希望它在 JOGL 中也类似)。模板只会阻止剩余的应用程序绘制您宝贵的像素。
关于禁用深度测试时,Java OpenGL 颜色 Material 变暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2520641/