【问题标题】:LibGDX Shader inactivates important SpriteBatch methodsLibGDX Shader 停用重要的 SpriteBatch 方法
【发布时间】:2015-10-01 12:29:41
【问题描述】:

我正在开发一款游戏并添加了一个着色器,它会将所有内容淡化为灰度,然后变为黑色。着色器本身工作正常,但是当我启动它时,Spritebatch 和 Sprites 的某些功能停止工作。颜色变化被忽略,任何事物的 Alpha 始终为 1。这些方法通常负责图形变化,当使用默认着色器时效果非常好:

sprite.setColor(Color.RED);
sprite.setAlpha((float)lifeTime/100f);
sprite.draw(pBatch);

此代码将弹出窗口着色为红色,更改 alpha,然后绘制它。当着色器打开时,它只是绘制它,就像前两行不存在一样。

这是着色器的代码:

顶点:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;

void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
}

片段:

#ifdef GL_ES
    precision mediump float;
#endif

varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform mat4 u_projTrans;

uniform float u_fade;

void main() {
        float gray_fade = u_fade;
        float dark_fade = 1;
        if(u_fade >= 1){
            gray_fade = 1;
            dark_fade = 2-u_fade;
        }

        vec4 color = texture2D(u_texture, v_texCoords).rgba;
        float gRed   = color.r - (color.r - (0.299*color.r +  0.587*color.g + 0.114*color.b))* gray_fade;
        float gGreen = color.g - (color.g - (0.299*color.r +  0.587*color.g + 0.114*color.b))* gray_fade;
        float gBlue  = color.b - (color.b - (0.299*color.r +  0.587*color.g + 0.114*color.b))* gray_fade;
        vec3 grayscale = vec3(gRed * dark_fade, gGreen * dark_fade, gBlue * dark_fade);


        gl_FragColor = vec4(grayscale, color.a);

}

【问题讨论】:

  • 我认为你没有自己编写着色器?
  • 我在教程的帮助下编写了这两篇文章,并对片段着色器进行了很多修改以使其适合我的游戏。顶点着色器基本相同
  • 好吧,只是好奇。这听起来像一个光滑的效果。

标签: opengl libgdx glsl


【解决方案1】:

您的着色器忽略了精灵的顶点颜色。

将声明varying vec4 v_color; 放入片段着色器并将最后一行更改为:

gl_FragColor = vec4(grayscale*v_color.rgb, color.a*v_color.a);

编辑:

我突然想到,如果场景中的某些精灵是彩色的,上述设置会破坏灰度设置,并且处理起来会很痛苦。因此,请不要理会 gl_FragColor 行,并将乘法上移到您对纹理颜色进行采样的位置:

vec4 color = texture2D(u_texture, v_texCoords) * v_color;

你的着色器也有很大的低效率,计算相同的点积三次!另外,我认为在某些情况下,一次计算整个向量可能比手动单独计算要快。

所以我会把中间那五行改成:

vec4 color = texture2D(u_texture, v_texCoords);
float grayValue = dot(color.rgb, vec3(0.299, 0.587, 0.1144));
vec3 grayscale = (color.rgb - (color.rgb - grayValue) * gray_fade) * dark_fade;

关于着色器中的if 语句:通常,分支语句在片段着色器中具有非常显着的影响,应避免使用。但在这种情况下,分支是制服上的 if 语句,所以我不确定它是否会产生任何重大影响,因为它会在整个绘图调用中评估相同的结果。也许其他人可以加入。如果这确实导致了很大的性能问题,您可以通过将 u_fade 替换为 u_gray_fadeu_dark_fade 并将此计算移出着色器来解决它。

【讨论】:

  • 非常感谢!它现在(几乎)工作得很好,但我想我可以自己做剩下的 :) 非常感谢你对性能的提示。我对着色器很陌生,当我刚刚使这些着色器工作时我很高兴:D 我会在编写下一个着色器时牢记性能提示;)
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多