首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenGL实现更平滑的渐变过渡?

使用OpenGL实现更平滑的渐变过渡?
EN

Stack Overflow用户
提问于 2018-07-17 23:32:30
回答 2查看 1.1K关注 0票数 5

我正在使用下面的着色器来渲染一个天穹来模拟夜空。我的问题是颜色之间清晰可见的过渡。

是什么导致了这些剧烈的梯度转换?

片段着色器:

代码语言:javascript
复制
#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像素格式:

代码语言:javascript
复制
GL.TexImage2D(
    TextureTarget.Texture2D,
    0,
    PixelInternalFormat.Rgb32f,
    WindowWidth,
    WindowHeight,
    0,
    PixelFormat.Rgb,
    PixelType.Float,
    IntPtr.Zero )
EN

回答 2

Stack Overflow用户

发布于 2018-07-18 14:20:45

正如Ripi2解释的那样,24位颜色无法完美地表示渐变,并且可表示颜色之间的不连续在单一颜色的渐变上变得不协调可见。

为了隐藏色带,我实现了一个简单的有序抖动形式,使用此bayer matrix algorithm生成的8x8纹理。

代码语言:javascript
复制
vec4 dither = vec4(texture2D(MyTexture0, gl_FragCoord.xy / 8.0).r / 32.0 - (1.0 / 128.0));
colourOut += dither;

票数 7
EN

Stack Overflow用户

发布于 2018-07-18 01:16:03

正常情况下,监视器的分辨率为每个通道8位。例如,红色强度在0到255之间变化。

如果你的窗口水平尺寸是768像素,并且你想要红色通道上的全渐变,那么每个颜色步长需要768/256 =3像素。根据你的眼睛健康状况,你可能会看到条纹。

如何在这3个像素上做平滑渐变?使用sub-pixel渲染。

基本上,你在相邻像素之间“扩展”颜色步长:向相邻像素添加少量的其他通道,并稍微减少中心像素的数量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51385290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档