【问题标题】:GLSL - make effect only on one textureGLSL - 只对一种纹理产生影响
【发布时间】:2014-01-17 23:02:31
【问题描述】:

我希望使用以下片段着色器来模糊我的背景:

varying vec4 vColor;
varying vec2 vTexCoord;

uniform vec2 screenSize;

uniform sampler2D u_texture;
uniform vec4 v_time;

const float RADIUS = 0.75;

const float SOFTNESS = 0.6;

const float blurSize = 1.0/1000.0;

void main() {

    vec4 texColor = vec4(0.0); // texture2D(u_texture, vTexCoord)
    texColor += texture2D(u_texture, vTexCoord - 4.0*blurSize) * 0.05;
    texColor += texture2D(u_texture, vTexCoord - 3.0*blurSize) * 0.09;
    texColor += texture2D(u_texture, vTexCoord - 2.0*blurSize) * 0.12;
    texColor += texture2D(u_texture, vTexCoord - blurSize) * 0.15;
    texColor += texture2D(u_texture, vTexCoord) * 0.16;
    texColor += texture2D(u_texture, vTexCoord + blurSize) * 0.15;
    texColor += texture2D(u_texture, vTexCoord + 2.0*blurSize) * 0.12;
    texColor += texture2D(u_texture, vTexCoord + 3.0*blurSize) * 0.09;
    texColor += texture2D(u_texture, vTexCoord + 4.0*blurSize) * 0.05;

    vec4 timedColor = (vColor + v_time);

    vec2 position = (gl_FragCoord.xy / screenSize.xy) - vec2(0.5);
    float len = length(position);

    float vignette = smoothstep(RADIUS, RADIUS-SOFTNESS, len);

    texColor.rgb = mix(texColor.rgb, texColor.rgb * vignette, 0.5);

    gl_FragColor = vec4(texColor.rgb * timedColor.rgb, texColor.a);
}

但问题是着色器模糊了所有屏幕。我应该写什么让它专注于我的背景纹理而不是整个屏幕?

【问题讨论】:

  • 我真的不明白你所说的“它模糊了所有屏幕”是什么意思。这通常是卷积滤波器的重点。您也许可以使用模板缓冲区来屏蔽屏幕的某些部分,但真正有帮助的是,如果您显示正在发生的事情的屏幕截图并解释您真正想要的内容(即在屏幕的一部分周围画一个圆圈)那不是“背景纹理”)。

标签: java glsl libgdx shader


【解决方案1】:

片段着色器适用于您使用该着色器绘制的三角形的每个像素。 可能是您将着色器应用于错误的三角形,而问题不是着色器。

我觉得那个着色器很奇怪。

vTexCoord - blurSize

vTexCoord - 是vec2

blurSize - 是float

如果你写一些东西,代码看起来会更正确

vTexCoord - vec2(blurSize, 0.0)

【讨论】:

  • 它可能看起来更正确,但这不是一个等价的表达式。 vec2 - float 实际上等价于vec2 - vec2 (float, float)。或者换句话说:vTexCoord - blurSize == vTexCoord - vec2 (blurSize, blurSize)。标量在操作完成之前被提升为向量,然后按组件进行评估。
【解决方案2】:

好的,我会回答我的问题。

我希望我的着色器程序只模糊背景纹理而不是整个屏幕。 所以我创建了两个着色器程序,一个用于背景,一个用于其余部分。 当程序绘制背景时,它切换到背景着色器,然后切换到默认着色器。

就是这么简单。

【讨论】:

  • 我没有显示问题并要求解决方案,我要求实现我的想法的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2017-09-06
  • 2011-04-03
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多