4

ゲームのAphaBlendingでこの問題が発生します。アルファテクスチャでサーフェスを描画すると、見えないはずの部分は見えなくなりますが、見えるはずの部分は半分透明になります。それは光の量に依存します-光源に近いほど見栄えが良くなりますが、影ではそのようなオブジェクトはほとんど消えます。

アルファブレンディングを有効にします。

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);

効果は同じです。アルファチャネル付きの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

1 に答える 1

3

フラグメントシェーダーは、テクスチャカラーの4つの(RGBA)コンポーネントすべてに拡散係数を掛けます。これにより、拡散光が消えるたびにアルファコンポーネントの傾向がゼロになり、スプライトがほとんど見えなくなります。

コードを修正するには、次のように変更します。

gl_FragColor = v_Color * texture2D(u_Texture, v_TexCoordinate);
gl_FragColor.rgb *= diffuse;
于 2013-03-14T19:16:39.697 に答える