我在游戏中遇到了这个问题,当我用alpha纹理绘制一个表面时,应该不可见的部分是不可见的,但应该可见的部分是半透明的。这取决于光的数量——越靠近光源,它看起来越好,但在阴影中,这样的物体几乎消失了。
我启用Alpha混合:
GLES20.glEnable(GLES20.GL_BLEND);
然后设置函数:
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
或
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
的效果还是一样的。我使用带alpha通道的48位png文件。
我的片段着色器看起来像这样:
final String fragmentShader =
"precision mediump float; n"
+"uniform vec3 u_LightPos; n"
+"uniform sampler2D u_Texture; n"
+"varying vec3 v_Position; n"
+"varying vec4 v_Color; n"
+"varying vec3 v_Normal; n"
+"varying vec2 v_TexCoordinate; n"
+"void main() n"
+"{ n"
+"float distance = length(u_LightPos - v_Position); n"
+"vec3 lightVector = normalize(u_LightPos - v_Position); n"
+"float diffuse = max(dot(v_Normal, lightVector), 0.0); n"
+"diffuse = diffuse * (" + Float.toString((float)Brightness) +" / (1.0 + (0.08 * distance))); n"
+"diffuse = diffuse; n"
//+3
+"gl_FragColor = (v_Color * diffuse * texture2D(u_Texture, v_TexCoordinate)); n"
+"} n";
和顶点着色器:
uniform mat4 u_MVPMatrix;
uniform mat4 u_MVMatrix;
attribute vec4 a_Position;
attribute vec3 a_Normal;
attribute vec2 a_TexCoordinate;
varying vec3 v_Position;
varying vec4 v_Color;
varying vec3 v_Normal;
varying vec2 v_TexCoordinate;
void main()
{
v_Position = vec3(u_MVMatrix * a_Position);
v_Color = a_Color;
v_TexCoordinate = a_TexCoordinate;
v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));
gl_Position = u_MVPMatrix * a_Position;
}
Thx for any suggestions:)
你的碎片着色器将纹理颜色的所有4个(RGBA)组件与漫射因子相乘。这将使你的alpha分量在漫射光消失时趋向于零,使你的精灵几乎不可见。
要修改你的代码,把它改成这样:
gl_FragColor = v_Color * texture2D(u_Texture, v_TexCoordinate);
gl_FragColor.rgb *= diffuse;