模糊镜像着色器

时间:2015-03-02 19:57:43

标签: opengl-es three.js opengl-es-2.0

有谁知道如何将Guassian Blur应用于镜面纹理? 我只是想将模糊应用于一个纹理,而不是我已经尝试过后处理dof的整个场景。

在我的片段着色器中,我无法弄清楚如何模糊texture2DProj的结果。 例如,如果我有以下行:

uniform sampler2D mirrorMap;
varying vec4 mirrorCoord;
void main(){
    mColor = texture2DProj(mirrorMap, mirrorCoord);
    gl_FragColor = mcolor;
}

我怎样才能做类似以下的事情:

vec4 sum = vec4( 0.0 );
float v = 1.0 / 250.0 ;
sum += texture2D( baseTexture, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;
sum += texture2D( baseTexture, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;
..etc

gl_FragColor = sum;

1 个答案:

答案 0 :(得分:1)

  

我正在使用threejs,我认为这是基于opengl es 2.0。

哦,好的。即使没有textureProjOffset (...),这也应该相当简单。

所有texture<1|2|3>DProj (...)实际上都是在进行纹理查找之前自动将前三个坐标除以4 th 坐标。在texture2DProj的情况下,这意味着:

st' = (stpq.s / stpq.q, stpq.t / stpq.q)
// The input coordinates had a 3rd coordinate but it's not used for anything in 2D

因此,您可以将texture2DProj (...)替换为texture2D (...),如下所示:

uniform sampler2D mirrorMap;
varying vec4 mirrorCoord;

void main(){
    vec2 unproj2D = vec2 (mirrorCoord.s / mirrorCoord.q,
                          mirrorCoord.t / mirrorCoord.q);

    mColor = texture2D(mirrorMap, unproj2D);
    gl_FragColor = mcolor;
}

然后您可以应用与原始问题中相同的逻辑,因为现在您拥有简单的2D坐标而不是4D齐次坐标。