2017-07-03 7 views
1

シェーダ内から、特定のFBOカラーの添付ファイルのカラー出力をすべて無視することはできますか?例えば、このようなシェーダ内のカラー出力を無視する

何か:

#version 330 

layout (location = 0) out vec4 output_A;  
layout (location = 1) out vec4 output_B; 

uniform float isGlass; 

void main(void) 
{ 
    if (isGlass = 0) 
    { 
     output_A = vec4(1,1,1,1); 
     output_B = vec4(1,1,1,1); 
    } 
    else 
    { 
     output_A = vec4(1,1,1,1); 
     output_B = NULL; 
    } 
} 

答えて

3

いいえ、これはシェーダ内からはできません。

しかし、2番目のレンダリングバッファにアルファブレンディング(glBlendFunci)を有効にして、何も書き込まない場合はアルファチャンネルを0に設定することで同様の効果を得ることができます。

編集:

シェーダでし二レンダーターゲットのブレンドモードは、このような(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)表情に設定されていると仮定した:

#version 330 

layout (location = 0) out vec4 output_A;  
layout (location = 1) out vec4 output_B; 

uniform float isGlass; 

void main(void) 
{ 
    if (isGlass = 0) 
    { 
     output_A = vec4(1,1,1,1); 
     output_B = vec4(1,1,1,1); 
    } 
    else 
    { 
     output_A = vec4(1,1,1,1); 
     output_B = vec4(0,0,0,0); //Will not be written since alpha = 0 
    } 
} 
+0

興味深いことに、個々のカラー添付ファイルのアルファブレンディングを有効/無効にできますか? –

+0

はい。それは 'glBlendFunci'があるところです。 – BDL

+0

私はこの作業をするのに苦労しています。目的は、ifステートメントの結果に応じて出力を書き込まないことです。 –

2

あなたはオフにしたい場合は、特定のへの書き込みこれはwrite maskingで行うのが最適です。カラーマスクはglColorMaskiとごとアタッチメントに基づいて有効/無効にすることができる。

glColorMask(buffer, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 

bufferは、出力変数が関連付けられている場所です。

もちろん、これは描画呼び出しの間にのみ行うことができます。しかし、これを制御するためにuniformを使用しているので、問題ではありません。

関連する問題