2013-03-14 105 views
4

我在我的遊戲中遇到了Apha混合問題,當我繪製具有alpha紋理的表面時,隱藏的是隱形的,但隱藏的部分是可見的是半透明的。這取決於光量 - 離光源越近,它看起來越好,但在陰影中,這些物體幾乎消失。Android Opengl 2.0 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:)   

回答

3

你的片段着色器乘以漫反射係數紋理顏色的所有4(RGBA)組件。只要漫射光消失,這將使你的alpha分量趨向零,使你的精靈幾乎看不見。

要解決你的代碼改變它的東西是這樣的:

gl_FragColor = v_Color * texture2D(u_Texture, v_TexCoordinate); 
gl_FragColor.rgb *= diffuse; 
+0

THX了很多人,它只是完美的:)所以簡單卻又如此輝煌!:) – Lucass 2013-03-14 19:46:09