2015-09-27 3 views
0

Si je comprends bien les FBO, je peux attacher plusieurs textures 2D à différents points de fixation de couleur. Je voudrais utiliser cette capacité pour écrire quelques types de données différents à partir d'un fragment shader (par exemple, position du monde et normales). Cela ressemble à autrefois, cela impliquait d'écrire dans gl_FragData à différents index, mais gl_FragData n'existe plus. Comment cela est-il fait maintenant?Comment fonctionne le rendu de plusieurs textures dans OpenGL moderne?

Répondre

4

Vous pouvez simplement ajouter des variables de sortie à votre fragment shader. Voici un exemple:

layout(location=0) out vec4 color; 
layout(location=1) out vec3 normal; 
layout(location=2) out vec3 position; 

void main() { 
    color = vec4(1,0,0,1); 
    normal = vec3(0,1,0); 
    position = vec3(1,2,3); 
} 
+0

Cela fonctionne à peu près, mais je frappe certaines bizarreries: si alpha blending est activé, les sorties COLOR_ATTACHMENTi doivent être vec4, de sorte que alpha peut être réglé t o non nul. Je n'ai pas réussi non plus à obtenir 'int' ou' ivec' pour fonctionner (ma solution terrible est de tout jeter sur des flotteurs). – bfops

2

Comme dit dari, vous pouvez utiliser le prescripteur layout(location=0).

Une autre méthode pour affecter l'endroit à l'extérieur du shader est d'utiliser:

glBindFragDataLocation(_program, 0, "color"); 

Puis dans le shader:

out vec4 color; 

Voir ce pour une discussion plus approfondie des tampons de sortie: https://www.opengl.org/wiki/Fragment_Shader#Output_buffers