Il semble y avoir beaucoup d'ambiguïté au sujet de gl_FragColor
étant obsolète. Par exemple, il manque dans la spécification GLSL 4.4 , mais il est inclus dans la spécification GLSL 4.6 .
Quelle est la stratégie la plus sûre, la plus compatible et la plus prise en charge? En utilisant gl_FragColor
ou définissant une sortie de shader comme out vec4 color
?
Oui, gl_FragColor
est obsolète. Vous devez utiliser la syntaxe suivante:
layout(location = 0) out vec4 diffuseColor;
Il est inclus dans la spécification GLSL 4.60 sous la section 7.1.7. Compatibility Profile Built-In Language Variables
. Cela signifie que si vous créez un contexte principal, cette variable ne sera pas disponible.
Si vous lisez attentivement la spécification GLSL 4.4 , vous trouverez gl_FragCoord
dans le chapitre "7.1.1 Variables de langage intégrées du profil de compatibilité", comme dans spécification GLSL 4.6 .
Les variables de sortie de fragment suivantes sont disponibles dans un shader de fragment lors de l'utilisation du profil de compatibilité :
out vec4 gl_FragColor; out vec4 gl_FragData[gl_MaxDrawBuffers];
Ecrire à
gl_FragColor
spécifie la couleur du fragment qui sera utilisée par le pipeline de fonctionnalités fixes suivant. Si la fonctionnalité fixe suivante consomme de la couleur de fragment et qu'une exécution de l'exécutable du shader de fragment n'écrit pas de valeur dansgl_FragColor
alors la couleur du fragment consommé n'est pas définie.
Cela signifie que vous ne pouvez pas utiliser gl_FragColor
, dans un Contexte de profil OpenGL Core , car il est obsolète, mais il serait toujours disponible dans un profil de compatibilité.
La manière moderne d'écrire dans les tampons de sortie à partir d'un shader de fragment, est de déclarer variables de sortie définies par l'utilisateur et d'utiliser qualificatifs de disposition .