2013-08-24 67 views
0

我使用这个片段着色器:的OpenGL - GLSL着色器,alpha混合

#version 150 core 

uniform sampler2D texture1; 

in vec4 pass_Color; 
in vec2 pass_TextureCoord; 

out vec4 out_Color; 

void main(void) { 
    out_Color = pass_Color; 
    // Override out_Color with our texture pixel 
    out_Color = texture(texture1, pass_TextureCoord) * pass_Color ; 
} 

我们pass_Color我举一个RGBA值。我改变了alpha值。纹理是rgba,也是一个PNG文件。我使用混合模式GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA。

现在的问题是,我通过在阿尔法值不会影响任何东西..

,我希望它..

+0

究竟是什么你想要它影响(它看起来像你期望融合发生在你的片段着色器通过设置out_Color两次......)?顺便说一下(这是用于混合的值,而不是pass_Color.a),它真的是您感兴趣的纹理(texture1,pass_TextureCoord).a * pass_Color.a的值。 –

+0

你是什么意思?在纹理()调用.a不编译 – Gopgop

+0

我的意思是只有alpha分量影响混合。并且您将纹理的alpha分量乘以pass_Color.a的alpha分量。这是两者相乘的结果,它决定了你的片段如何混合。 –

回答

0

我落得这样做:

vec4 tex = texture(texture1, pass_TextureCoord); 
out_Color = vec4(tex.r*(pass_Color[0]),tex.g*(pass_Color[1]),tex.b*(pass_Color[2]),tex.a*(pass_Color[3])) ; 

工作得很好!

+4

这没有任何意义,您应该坚持使用相同的组件选择语法来保持一致性。使用'tex [0] * pass_Color [0]'或'tex.r * pass_Color.r'这样人们就可以理解你的代码。此外,您可以只执行'tex.rgba * pass_Color.rgba'或'tex * pass_Color'并获得相同的结果,而不会使您的代码难以阅读。 –

+1

如果这样做,原来没有,这听起来像你的司机是*令人难以置信的*越野车。 –

+0

不,事实证明alpha值没有正确传递。所以我认为这是它的工作原理..但它实际上是其他的东西.. – Gopgop