2017-07-03 1 views
1

Est-il possible, dans le nuanceur, d'ignorer la sortie couleur pour une pièce jointe couleur FBO particulière?Ignorer la sortie couleur à l'intérieur du nuanceur

Quelque chose comme ceci par exemple:

#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; 
    } 
} 

Répondre

3

Non, ce n'est pas possible à l'intérieur d'un shader.

Mais vous pouvez obtenir un effet similaire en activant l'alpha-blending (glBlendFunci) pour le deuxième rendu et en définissant le canal alpha sur 0 lorsque rien ne doit être écrit.

Edit:

Le shader pourrait sous l'hypothèse que le mode de fusion pour la deuxième cible de rendu est réglé sur (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ressembler à ceci:

#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

Intéressant, de sorte que vous pouvez activer/désactiver le mélange alpha pour les pièces jointes couleur individuelles? –

+0

Oui. Voilà pour quoi 'glBlendFunci' est là. – BDL

+0

Je me bats pour que cela fonctionne, si vous avez un moment, pourriez-vous poster un exemple de shader? Le but est d'écrire aucune sortie en fonction du résultat d'une instruction if. –

2

Si vous souhaitez désactiver écrit à un particulier l'attachement, ceci est mieux fait par write masking. masques de couleur peuvent être activés/désactivés sur une base par fixation avec glColorMaski:

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

buffer est l'emplacement que la variable de sortie est associé.

Bien sûr, cela ne peut se faire qu'entre les appels draw. Mais puisque vous utilisez un uniform pour contrôler cela, cela ne devrait pas poser de problème.