首页 > 解决方案 > 为什么我的示例游戏中的颜色不连续(层)与照明?

问题描述

我正在测试 Sokol 库 ( https://github.com/floooh/sokol ) 以在 OpenGL、D3D11 和 Metal 中创建一个带有光照的简单游戏示例。我正在使用与 LearnOpenGL 教程(https://learnopengl.com/Lighting/Light-casters)类似的着色器。

这是我的片段着色器的一部分:

vec3 lightDir = normalize(light.position - v_position);
float diff = max(dot(normal, lightDir), 0.0);
diffuse = vec3(1.0,1.0,1.0) * diff * vec3(texture(u_diffuse, v_uv)); 

地面的颜色不是连续的,你可以看到颜色层(看红线)。

颜色层中的红光

这是另一个使用 PBR 着色器的示例。同样,地面的颜色不是连续的。

色层再次出现红光

为什么会发生这种情况?如何创建一个完美的平面地面?

标签: graphicsglsllighting

解决方案


您看到的“波段”在其中一个颜色通道中仅相差 1。您刚刚达到每通道颜色精度 8 位的实际限制,这两个波段之间没有其他可呈现的颜色。根据您使用的显示和显示设置,它或多或少会被察觉。有3种可能的解决方案:

  • 效果特别明显,因为您的地板是用一种纯色着色的。人眼对这种变化最为敏感(另见马赫带效应)。通过为其添加一些结构/纹理,它将不再可感知。
  • 使用每通道颜色精度超过 8 位的显示器。现在的 HDR 显示器确实允许 10 位或更多位。
  • 对图像应用一些抖动以隐藏可见带。可以在 GLSL 着色器中轻松实现带有一些拜耳模式的有序抖动。

推荐阅读