2016-08-05 10 views
-1

LWJGLの透明性に問題があります。シェーダはアルファチャンネルを使用していないようです。たとえば、アルファチャンネルを0.1に設定すると、すべてがアルファチャンネルとして表示されます。しかし、私が作成しているプログラムでは、オブジェクトを完全にまたは完全にクリアにする必要があります。通常、フラグメントシェーダでdiscardコマンドを使用しますが、複数のターゲットにレンダリングしているため、両方のターゲットのフラグメントを破棄します。 ThnMatrixのチュートリアルにも従っています。LWJGLの透明度の問題

私の質問は、シェーダでレンダリングするときにアルファが機能しないのはなぜですか?私はすでにGL_BLENDのすべてを試していますが、まだ運がありません。ありがとうございました!

P.S.私は、GUIと透明/透明度をレンダリングするもう1つのシェーダがうまく動作します。シェーダ間で見られる唯一の主な違いは、頂点シェーダです。

フラグメントシェーダ:

#version 330 core 

in vec2 pass_textureCoords; 
in vec3 surfaceNormal; 
in vec3 toLightVector[4]; 
in vec3 toCameraVector; 
in float visibility; 

layout (location = 0) out vec4 out_Color; 
layout (location = 1)out vec4 out_BrightColour; 


uniform sampler2D textureSampler; 
uniform vec3 lightColor[4]; 

uniform vec3 attenuation[4]; 

uniform float shineDamper; 
uniform float reflectivity; 

uniform float selected; 


//effects 
uniform float bloomFactor = 0; 



uniform vec3 skyColor; 

void main(void){ 


vec3 unitNormal = normalize(surfaceNormal); 
vec3 unitVectorToCamera = normalize(toCameraVector); 

vec3 totalDiffuse = vec3(0.0); 
vec3 totalSpecular = vec3(0.0); 

for(int i = 0; i < 4; i++){ 
float distance = length(toLightVector[i]); 
float attFactor = attenuation[i].x + (attenuation[i].y * distance) + (attenuation[i].z * distance * distance); 
vec3 unitLightVector = normalize(toLightVector[i]); 
float nDot1 = dot(unitNormal, unitLightVector); 
float brightness = max(nDot1, 0.0); 
vec3 lightDirection = -unitLightVector; 
vec3 reflectedLightDirection = reflect(lightDirection, unitNormal); 
float specularFactor = dot(reflectedLightDirection, unitVectorToCamera); 
specularFactor = max(specularFactor, 0.0); 
float dampedFactor = pow(specularFactor, shineDamper); 
totalDiffuse = totalDiffuse + (brightness * lightColor[i])/attFactor; 
totalSpecular = totalSpecular + (dampedFactor * lightColor[i] * reflectivity)/attFactor; 
} 
totalDiffuse = max(totalDiffuse, 0.2); 
vec4 textureColor = texture(textureSampler, pass_textureCoords); 






out_Color = vec4(totalDiffuse, 1.0) * textureColor + vec4(totalSpecular, 1.0); 
out_Color = mix(vec4(skyColor, 1.0), out_Color, visibility); 
if(selected > 0.5){ 
out_Color.r += 0.75; 

} 
if(out_Color.a<0.5){ 
discard; 

} 


//float brightness = (out_Color.r * 0.2126) + (out_Color.g * 0.7152) + (out_Color.b * 0.0722); 
out_BrightColour = vec4(0.0); 




} 

答えて

1
out_Color = vec4(totalDiffuse, 1.0) * textureColor + vec4(totalSpecular, 1.0); 

この式保証out_Color.aは常に> = 1.0になること。

textureColor.aが0.0の場合は、完全に透明になり、0に1を掛けてもゼロになります。さて、1を加えると0になるのでしょうか?そして、それはtextureColor.aが可能な限り低い値であった場合です。 1.0の場合はout_Color.aが2.0(1.0に戻されます)になります。

+0

ありがとうございました!私はそれを見ることさえ考えなかった!しかし、私はまだ同じ問題が発生しています。 –

関連する問題