我正在使用下面的着色器来渲染一个天穹来模拟夜空。我的问题是颜色之间清晰可见的过渡。
是什么导致了这些剧烈的梯度转换?

片段着色器:
#version 330
in vec3 worldPosition;
layout(location = 0) out vec4 outputColor;
void main()
{
float height = 0.007*(abs(worldPosition.y)-200);
vec4 apexColor = vec4(0,0,0,1);
vec4 centerColor = vec4(0.159, 0.132, 0.1, 1);
outputColor = mix(centerColor, apexColor, height);
}Fbo像素格式:
GL.TexImage2D(
TextureTarget.Texture2D,
0,
PixelInternalFormat.Rgb32f,
WindowWidth,
WindowHeight,
0,
PixelFormat.Rgb,
PixelType.Float,
IntPtr.Zero )发布于 2018-07-18 14:20:45
正如Ripi2解释的那样,24位颜色无法完美地表示渐变,并且可表示颜色之间的不连续在单一颜色的渐变上变得不协调可见。
为了隐藏色带,我实现了一个简单的有序抖动形式,使用此bayer matrix algorithm生成的8x8纹理。

vec4 dither = vec4(texture2D(MyTexture0, gl_FragCoord.xy / 8.0).r / 32.0 - (1.0 / 128.0));
colourOut += dither;

发布于 2018-07-18 01:16:03
正常情况下,监视器的分辨率为每个通道8位。例如,红色强度在0到255之间变化。
如果你的窗口水平尺寸是768像素,并且你想要红色通道上的全渐变,那么每个颜色步长需要768/256 =3像素。根据你的眼睛健康状况,你可能会看到条纹。
如何在这3个像素上做平滑渐变?使用sub-pixel渲染。
基本上,你在相邻像素之间“扩展”颜色步长:向相邻像素添加少量的其他通道,并稍微减少中心像素的数量。
https://stackoverflow.com/questions/51385290
复制相似问题