2015-08-13 34 views
1

我被卡住了片段着色器。我设法从上到下显示一个线性渐变(cp。左图)。目标是将径向白色渐变叠加到此线性渐变上(如左图所示的黑色虚线=>右图所示为目标)。如何在片段着色器内的线性渐变上叠加径向渐变?

我知道我必须以某种方式组合x和y坐标,但是迄今为止所有的试验都失败了 - 我觉得数学太糟糕了 - /我也没有想出如何混合蓝色以实现白色阴影。

有人能帮我一个提示吗?

enter image description here

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

// 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.); 
} 

回答

3

下面是一些代码,应该做你需要的东西:

// 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); 
+0

哇 - 非常非常感谢你!我没有想到一个完整的解决方案:-D只是伟大的 - 你的代码完美无瑕!正是我需要的。 – salocinx

+0

很高兴认识这个!如果你需要更多的“数学”解释,我会很乐意提供帮助,只是告诉我你不了解的内容。 –

+0

感谢您的报价。目前没有更多的数学问题,我仍在试验你的非常酷的着色器:-)但是我看到你是一个OpenGL ES专家 - 也许你可以帮我解决另一个我正在与之战斗的OpenGL问题:http:// stackoverflow。 COM /问题/ 32008308/OpenGL的ES-2-0-如何对提高帧率-的拉 - 精灵 – salocinx