我一直在使用OpenGL(JOGL)中的深度缓冲区,以通过禁用深度缓冲区来确保某些项目在其他对象之前呈现(在我先前的问题Java OpenGL saving depth buffer中进行了详细介绍)。

这是可行的,除了当我在禁用深度测试时设置要绘制的项目的颜色时,没有任何材料的光泽感出现。该项目呈现为原始颜色的较暗版本(似乎没有真正应用的照明效果)。有什么理由会发生这种情况吗?我该如何预防呢?

谢谢,
杰夫

最佳答案

到目前为止,由于您还没有答案,因此我会尽力而为,尽管我在这里确实有点猜测。

我可以想象的一些原因,以及为什么会看到这种效果:

  • 与照明模型的环境和漫反射组件相反,镜面反射组件需要考虑眼睛相对于对象和光源的位置。因此,当OpenGL使用深度缓冲区时,这可能会更快。我认为,这种方式-对于要绘制的每个像素-它可以使用深度值来完成带有z分量的眼睛坐标。
  • 也许还与光衰减有关?当使用光衰减时,OpenGL计算距离,光线到达您的眼睛之前必须经过该距离(或者是否仅通过计算光线和对象之间的距离来简化距离?我不确定。)

  • 因此,我假设没有深度缓冲区就无法正确使用照明。我想您在另一篇文章中提到,您不能只清除深度缓冲区,因为它会干扰其余的应用程序吗?我认为应该有一个带有模板的解决方案,类似于http://www.glprogramming.com/red/chapter10.html中的“示例10-1:使用模板测试”(它是用C编写的,但我希望它与JOGL类似)。模具将简单地阻止其余应用程序绘制您的宝贵像素。

    10-04 22:38
    查看更多