【问题标题】:GLSL Grayscale Shader removes transparencyGLSL 灰度着色器移除透明度
【发布时间】:2015-07-30 16:31:50
【问题描述】:

我对 GLSL 非常陌生,并从简单的灰度阴影开始。我使用了 GamesFromScratch 教程的代码:

顶点着色器:

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 vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform mat4 u_projTrans;

void main() {
        vec3 color = texture2D(u_texture, v_texCoords).rgb;
        float gray = (color.r + color.g + color.b) / 3.0;
        vec3 grayscale = vec3(gray);

        gl_FragColor = vec4(grayscale, 1.0);
}

效果和问题:一切都只渲染成灰度,但是纹理的透明部分变成了白色。例如:一个简单的实心圆通常画成一个圆。现在它是一个白色盒子内的圆圈。在被移除的透明部分旁边,alpha 上的变化也是不可见的。

【问题讨论】:

  • 您将输出的 alpha 设置为 1.0。如果您使输出完全不透明,为什么您仍然希望看到透明?
  • 不相关,但所有涉及 v_color 的内容都可以从此着色器中移除,因为它未使用。
  • 除以 3 不会得到 100 个正确结果。下面的答案是做灰度的正确方法。

标签: opengl libgdx shader


【解决方案1】:

问题出在您的片段着色器中。您创建一个vec3 color 想象 (r,g,b) 然后将 gl_FragColor 设置为 vec4 (r,g,b,a)。使用灰度中的前三个,然后将“a”设置为硬编码的 alpha 值 1,去除任何透明度。

您可以从采样器中获取 rgba 并在最终的 vec4 中使用其 alpha。

此外,如果您正在寻找更真实的灰度转换,一般标准是

color = 0.299 * r + 0.587 * g + 0.114 * b

https://en.wikipedia.org/wiki/Grayscale

【讨论】:

  • 有点吹毛求疵:“此外,如果您正在寻找更真实的灰度转换,一般标准是......”。您在此处引用的是 ITU-R BT.601 中指定的 RGB 到 Luma 转换。然而,标准的好处是可以从中选择。例如,BT 701 使用 (0.2126, 0.7152, 0.0722) 和 SMPTE 240M (0.212, 0.701, 0.087)。实际系数将取决于正在使用的 RGB 颜色空间的定义。
  • 谢谢,这对我有很大帮助。不知道我怎么能忽略这部分。现在看起来很明显。但是oe问题仍然存在:我经常使用sprite.draw(batch)并更改了alpha。所以通常精灵变得透明,但是当着色器被激活时,精灵的 alpha 值被忽略。同样batch.setColor(Color.DARK_GRAY);在着色器启动时没有效果
【解决方案2】:

我认为这些更改会对您有所帮助。

vec4 color = texture2D(u_texture, v_texCoords);
float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(grayscale, color.a);

在我的更改中,我从纹理中读取带有 alpha 的颜色并将其应用于输出。

【讨论】:

  • 这就是 GLSL 的做法。应标记为正确答案。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多