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?
0
A
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);
}
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
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