Je cherche un moyen d'accéder aux états OpenGL à partir d'un shader. Le GLSL Quick Reference Guide, une ressource impressionnante, ne pouvait pas vraiment m'aider sur celui-ci.GLSL: activer/désactiver texturing + shaders
Dans l'exemple, je travaille sur deux j'ai les shaders suivants:
Vertex:
void main()
{
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
Fragment:
uniform sampler2D tex;
uniform float flattening;
void main(void)
{
vec4 texel;
texel = texture2D(tex, gl_TexCoord[0].st);
texel.r *= gl_Color.r;
texel.g *= gl_Color.g;
texel.b *= gl_Color.b;
texel.a *= gl_Color.a;
gl_FragColor = texel;
}
Quand je suis rendu des polygones qui ne sont pas texturé, leurs valeurs alpha sont correctes, mais ils sont assignés à la couleur noire.
1, Quelle vérification conditionnelle puis-je configurer de sorte que la variable 'texel' soit définie comme vec4(1.0, 1.0, 1.0, 1.0)
plutôt que d'échantillonner à partir d'une texture lorsque GL_TEXTURE_2D
est désactivé?
2, Le traitement serait-il plus rapide si j'écrivais différents shaders pour différents modes de texturation et passais entre eux où j'utiliserais glEnable
/glDisable
(GL_TEXTURE_2D
)?
Remarque: vous pouvez écrire texel * = gl_Color; comme un vecteur op au lieu de 4 opérations scalaires. – Macke
merci, est-ce matériel accéléré? ne serait-ce pas un appel de fonction et 4 opérations scalaires vs 4 opérations scalaires? – zyndor
Il est accéléré (si vous n'exécutez pas tous les shaders dans le logiciel, auquel cas vous êtes dans un espace de secondes par trame), mais il n'y a pas d'appel de fonction supplémentaire. Il est vrai que ce sera toujours 4 opérations scalaires (sur les GPU modernes), je pense juste comme une opération vectorielle, mais il est aussi beaucoup plus facile de suivre et de déboguer le code de cette façon. (Les compilateurs GLSL alignent très fortement les choses pour éviter les surcharges d'appel de fonction.) – Macke