web-dev-qa-db-fra.com

Utilisation de gl_FragColor vs out vec4 color?

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?

8
IntellectualKitty

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.

4
dari

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 dans gl_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 .

1
Rabbid76