2010-12-11 4 views
4

J'ai un vertex shader avec des attributs qui peuvent être définis ou non dans une trame donnée. Comment puis-je vérifier si ces attributs ont été définis ou non?GLSL - Vérification des attributs d'ensemble

Ce que je voudrais faire:

attribute vec3 position; 
attribute vec3 normal; 
attribute vec4 color; 
attribute vec2 textureCoord; 


uniform mat4 perspective; 
uniform mat4 modelview; 
uniform mat4 camera; 
uniform sampler2D textureSampler; 

varying lowp vec4 vColor; 

void main() { 
    gl_Position = perspective * camera * modelview * vec4(position, 1.0); 
if ((bool)textureCoord) { // syntax error 
    vColor = texture2D(textureSampler, textureCoord); 
} else { 
    vColor = (bool)color ? color : vec4((normal.xyz + 1.0)/2.0 , 1.0); 
} 
} 
+1

Nous parlons de GL ES 2, je pressume? – Kos

Répondre

9

J'ai un vertex shader avec des attributs qui peuvent ou peuvent ne pas être définies dans un cadre donné.

Non, non. :)

Avec les attributs, il est impossible qu'un attribut ne soit pas "défini". Chaque instance de vertex shader reçoit des valeurs valides de chaque attribut déclaré.

Si l'attribut array n'est pas activé par glEnableVertexArray, l'attribut par défaut (tel que spécifié par glVertexAttrib et ses valeurs par défaut) sera transmis.


Dans votre cas, vous pouvez:

  • compilez votre shader en différentes versions avec ou sans texturation (compilation conditionnelle est votre ami, google pour UberShader),
  • utiliser une variable uniforme comme "useTexturing" pour enregistrer sur les commutateurs de shader.

Choisissez un.

+0

C'est ce dont j'avais peur - merci! – schellsan

+0

Oh btw, une exception à ce que j'ai dit - l'attribut est susceptible d'être optimisé par le compilateur/éditeur de liens (ie retiré du shader code et répond avec -1 en réponse à 'getVertexAttribLocation') s'il n'est utilisé nulle part dans le shader code. Mais ce n'est pas le cas. – Kos

+0

@Kos Bon à savoir que OpenGL se gère à ce stade. Savez-vous quelles valeurs par défaut seront utilisées si rien d'autre n'est défini? –