禁用深度测试时,Java OpenGL 颜色 Material 变暗

标签 java opengl colors jogl depth-buffer

我一直在使用 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/

相关文章:

固定功能管线中的OpenGL每像素照明

javascript - 获取网页的颜色直方图

java - 在java中读取.class文件

java - 无法静态引用非静态方法。我将如何解决此问题

opengl - 具有连续随机偏移的纹理平铺?

colors - 透明颜色的十六进制代码是什么?

matlab - 如何在matlab中将L*a*b*转换为灰度

Java从字符串中删除非拉丁基本字符

java - Android:movie.draw 上 0x00000000(代码=1)处的致命信号 11 (SIGSEGV)

python - 如何生成圆环结?