Fragment Shader GLSL para textura, color y textura / color

Quiero lograr un sombreador GLSL, que pueda textura y colorear mis objects de vértice. De hecho, me funciona en 2 de 3 casos:

1) Si solo tengo una textura asignada (pero no hay un color específico, por lo que el color es "blanco"), simplemente obtengo un object texturado, funciona

2) Si tengo una textura y un color asignado, obtendré un object con textura modulado con ese color, funciona

3) Si solo tengo un color asignado pero no hay textura, obtengo un object negro, no funciona

My Shader se ve así:

varying lowp vec4 colorVarying; varying mediump vec2 texcoordVarying; uniform sampler2D texture; void main(){ gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying; } 

Supongo que, texture2D (…, …) devuelve cero si no se asigna textura, por lo que parece ser el problema. ¿Hay alguna manera en GLSL que puedo verificar, si no se asigna textura (en este caso, simplemente quiero gl_FragColor = colorVarying;)

"Si" no es realmente una opción en un sombreador GLSL, si entendiera correctamente, ¿alguna idea para lograr esto? ¿O es realmente necesario crear 2 sombreadores diferentes para ambos casos?

Al igual que usted, había tomado el consejo general de que "si" se debe evitar en el hardware mobile actual, pero una discusión previa de optimization sobre StackOverflow parecía sugerir que no era un obstáculo importante. Entonces, no lo escribas. En cualquier caso, el comstackdor GLSL es razonablemente inteligente y puede optar por cambiar qué código se ejecuta en function de los valores establecidos para los uniformes, aunque en ese caso, todo lo que obtiene es el mismo que si hubiera suministrado sombreadores alternativos.

Dicho esto, si está absolutamente seguro de que desea usar el mismo sombreador para todos los propósitos y quiere evitar afirmaciones si probablemente quiera algo así:

 uniform lowp float textureFlag; [...] gl_FragColor = textureFlag * texture2D(texture, texcoordVarying) * colorVarying + (1.0 - textureFlag) * colorVarying; 

O incluso:

 gl_FragColor = mix( colorVarying, texture2D(texture, texcoordVarying) * colorVarying, textureFlag ) 

Con la configuration de textureFlag a 1.0 o 0.0 dependiendo de si desea tener en count los valores de textura.

No tengo conocimiento de ninguna forma de determinar (i) si un sampler2D apunta a una unidad de textura real; y (ii) si una unidad de textura particular tiene un buffer unido a él para el que se han cargado datos.