【发布时间】: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 个正确结果。下面的答案是做灰度的正确方法。