2017-03-19 6 views
0

Je souhaite utiliser la fonction glDrawArraysInstanced pour doubler le triangle. La différence entre les deux est la matrice MVP. Puis j'applique un FBO avec 2 GL_COLOR_ATTACHMENT, et active glDrawBuffers (2, ...).Changement d'emplacement de mise en page lors de la sortie de données dans fragmentShader

mon vertex shader:

#version 430 core 

layout (location = 0) in vec3 position; 

uniform mat4 uModel; 
uniform mat4 uView[2]; 
uniform mat4 uProjection[2]; 

out flat int ID; 

void main() 
{ 
    gl_Position = uProjection[gl_InstanceID] * uView[gl_InstanceID] * uModel * vec4(position.x, position.y, position.z, 1.0); 
    ID = gl_InstanceID; 
} 

mon shader fragment:

#version 430 core 

layout (location = 0) out vec3 color; 
layout (location = 1) out vec3 color1; 

in flat int ID; 

void main() 
{ 
    if (ID == 0) color = vec3(1.0f, 0.5f, 0.2f); 
    if (ID == 1) color1 = vec3(1.0f, 0.0f, 0.0f); 
} 

Le résultat est: 4 triangles..

Il semble que chaque instanciés avait mettre en œuvre la couleur et déclaration color1. Donc, est-ce que l'instruction 'if' est invalide? Et ma question est de savoir comment limiter la cible de sortie dans fbo et pendant un passage.

Répondre

2

On ne peut pas empêcher un shader d'écrire dans toutes les sorties qu'il a attachées. Ce que votre code fait est de affecter une valeur juste à une sortie, mais l'autre est toujours écrit.

Si vous souhaitez obtenir une sortie visible dans une seule des pièces jointes, vous pouvez, par exemple, écrire une couleur totalement transparente dans la sortie et activer le mélange alpha.

+0

Notez que, si l'ID était un uniforme plutôt qu'une entrée, vous pouvez utiliser des masques d'écriture pour désactiver les écritures dans ces tampons particuliers. –

+0

Merci pour votre réponse, je vais l'essayer dès maintenant.Mais il semble un peu de déchets ... –

+0

Une nouvelle question .... Comme vous le dites, si le shader va écrire dans toutes les sorties, la gauche et la droite ne sera pas être le même triangle de couleur, et il sera 'orange' 'rouge' et 'rouge' 'orange'.So, l'instruction' if 'est-elle invalide? –