2016-06-01 24 views
0

Ich möchte einen Vertex-Shader schreiben mit Farben und Texturen zu arbeiten habe ich diesen CodeOpenGL ES2 Farbe und Textur-Shader

precision mediump float; 
varying vec4 v_Color; 
uniform sampler2D u_TextureUnit; 
varying vec2 v_TextureCoordinates; 

void main() { 
    gl_FragColor= (v_Color*texture2D(u_TextureUnit, v_TextureCoordinates)); 
} 

es funktioniert, wenn das Modell eine Textur hat, aber wenn das Modell nur Farbe hat lädt schwarz, ich möchte den sampler2D überprüfen u_TextureUnit vor dem setzen gl_FragColor

Antwort

4

Sie haben einen Shader geschrieben, der aus einer Texture Unit liest; Sie sollten die Konditionalität in Shadern generell vermeiden, da sie den Ausführungspfad möglicherweise spaltet. Normalerweise kann ein Compiler es herausfinden, wenn die Sache, auf die Sie sich verhalten, eine Uniform ist, aber Sie können am Ende für eine Neukompilierung jedes Mal zahlen, wenn Sie die Uniform festlegen. ES 2 hat keine Mittel, um die aktuellen Eigenschaften einer Abtasteinheit introspecting so die prima facie Lösung sein könnte wie:

uniform bool u_ApplyTexture; 
... 
if(u_ApplyTexture) 
    gl_FragColor = {what you already have}; 
else 
    gl_FragColor = v_Color; 

Ein nicht bedingte alternativen möglicherweise als Alternative zum Profil könnte sein:

uniform float u_TextureWeight; 
... 
gl_FragColor = v_Color* 
        mix(vec4(1.0), 
         texture2D(u_TextureUnit, v_TextureCoordinates), 
         u_TextureWeight); 

Als würde v_Color*vec4(1.0) ausgewertet, wenn u_TextureWeight ist 0.0 und v_Color*texture2D(u_TextureUnit, v_TextureCoordinates) wenn u_TextureWeight ist 1.0.

Wenn Sie wirklich suchen Hacky sein, Sie können nur Ihre Texturen als negative Bilder und negative sie wieder im Shader laden:

gl_FragColor = v_Color*(vec4(1.0) - texture2D(u_TextureUnit, v_TextureCoordinates)); 

Als dann offensichtlich, wenn Sie vec4(0.0) aus der Abtasteinheit sind immer weil keine Textur angehängt ist, multipliziert sich v_Color durch 1.0.

+1

Ich würde mit der ersten nicht-hackish Lösung bleiben :) Oder verwenden Sie zwei verschiedene Shader ... – 246tNt

+0

In der Tat. Einfachste Sache zuerst, immer. Fügen Sie Komplexität nur in dem Maße hinzu, in dem die Leistung es für notwendig erachtet. – Tommy

+0

Ideale Antwort, danke – Mohamed