2013-03-14 5 views
4

내 게임에서 Apha Blending과 관련된 문제가 있습니다. 알파 텍스처가있는 서페이스를 그릴 때 보이지 않는 것이고 보이지 않는 것은 보이지 않지만 표시가 가능한 부분은 보이게됩니다. 절반은 투명하다. 그것은 빛의 양에 달려 있습니다. 광원에 가까울수록 빛이 더 좋아 보이지만 그림자에서는 그러한 물체가 거의 사라집니다.Android OpenGL 2.0 알파 블렌딩 문제 - 반투명 텍스처

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

또는

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

효과는 여전히 동일하다 :

GLES20.glEnable(GLES20.GL_BLEND); 

다음 I의 기능을 설정

는 I 알파 블렌딩 가능. 나는 알파 채널과 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) 구성 요소를 곱합니다. 이렇게하면 디퓨즈 라이트가 사라질 때마다 알파 성분 트렌드가 0으로 설정되어 스프라이트가 거의 보이지 않게됩니다. , 그냥 완벽하게 작동

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

들으 많은 남자 : 그래서 간단하지만 너무 화려한 :)을 :

는 다음과 같이 귀하의 코드 변경을 해결하려면! – Lucass