【问题标题】:How to overlay a radial gradient over a linear gradient within a fragment shader?如何在片段着色器中将径向渐变覆盖在线性渐变上?
【发布时间】:2015-08-14 17:58:22
【问题描述】:

我被片段着色器困住了。我设法从上到下显示了一个线性渐变(cp。左图)。目标是在这个线性渐变上叠加一个放射状的白色渐变(左图中的黑色虚线 => 右图说明了目标)。

我知道我必须以某种方式组合 x 和 y 坐标,但到目前为止所有试验都失败了 - 我认为我的数学太差了 :-/ 我也没有弄清楚如何混合蓝色为了获得白色阴影。

有人可以帮我一个提示吗?

这是给出左图结果的当前着色器(取决于颜色制服):

// Precision
precision highp float;
// Uniforms
uniform vec2 uResolution;
// Colors
uniform vec3 uColor1;
uniform vec3 uColor2;

void main(void) {
    vec2 position = gl_FragCoord.xy/uResolution;
    vec3 color = vec3(uColor2.x+(uColor1.x-uColor2.x)*position.y, uColor2.y+(uColor1.y-uColor2.y)*position.y, uColor2.z+(uColor1.z-uColor2.z)*position.y);
    gl_FragColor = vec4(color.x, color.y, color.z, 1.);
}

【问题讨论】:

    标签: android ios opengl-es-2.0 fragment-shader


    【解决方案1】:

    这里有一些代码可以满足你的需要:

    // Precision
    precision highp float;
    // Uniforms
    uniform vec2 uResolution;
    // Colors
    uniform vec3 uColor1;
    uniform vec3 uColor2;
    
    // parameters of the radial gradient
    uniform vec2  uRadialFxCenter; // this should be in [0-1], so normalized screen coords
    uniform float uRadialFxRadius; // this should be in [0-1], so normalized screen coords
    uniform vec3 uRadialFxColor;    // should be white
    uniform float uRadialFxOpacity; // between [0-1]
    
    void main(void) {
        vec2 position = gl_FragCoord.xy/uResolution;
        vec3 color = vec3(uColor2.x+(uColor1.x-uColor2.x)*position.y, 
                          uColor2.y+(uColor1.y-uColor2.y)*position.y, 
                          uColor2.z+(uColor1.z-uColor2.z)*position.y);
    
        // compute radial fx opacity => alpha
        vec2 posToRadialFxCenter = uRadialFxCenter - position;
        float distToCenterNormalized = min((length(posToRadialFxCenter)/uRadialFxRadius), 1.0);
        float alpha = (1.0-distToCenterNormalized) * uRadialFxOpacity;
    
        // alpha blending radialFxColor / color 
        color = color * (1.0-alpha) + uRadialFxColor * alpha;
    
        //
        gl_FragColor = vec4(color.x, color.y, color.z, 1.);
    }
    

    您还可以通过添加以下内容来控制径向渐变渐变的“斜率”:

    distToCenterNormalized = pow(distToCenterNormalized, slope);
    

    【讨论】:

    • 哇——非常非常感谢您!我没想到会有一个完整的解决方案 :-D 太好了 - 您的代码运行完美!正是我需要的。
    • 很高兴知道这一点!如果您需要更多“数学”解释,我很乐意提供帮助,请告诉我您不明白的地方。
    • 感谢您的报价。目前没有更多的数学问题,我仍在尝试使用您非常酷的着色器 :-) 但我看到您是 OpenGL ES 专家 - 也许您可以帮助我解决我正在解决的另一个 OpenGL 问题:stackoverflow.com/questions/32008308/…
    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2021-06-21
    • 2023-03-25
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多