2016-06-01 8 views
0
私はこのコード

のOpenGL ES2の色とテクスチャシェーダ

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)); 
} 

モデルはテクスチャマップを持っているとき、それが動作を使用しますが、モデルが持っている場合にのみ、それを着色し、色やテクスチャで動作するように一つの頂点シェーダを書きたい

黒をロードします。を入れる前にsampler2Dを確認しますgl_FragColor

答えて

4

テクスチャユニットから読み込んだシェーダを書きました。実行パスを分割する可能性があるため、一般的にシェーダの条件を避ける必要があります。あなたが条件付きで動作しているものが統一されている場合、通常、コンパイラはそれを理解することができますが、ユニフォームを設定するたびに再コンパイルを支払う可能性があります。かもしれない代替としてプロファイルする可能性

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

非条件代替:

uniform float u_TextureWeight; 
... 
gl_FragColor = v_Color* 
        mix(vec4(1.0), 
         texture2D(u_TextureUnit, v_TextureCoordinates), 
         u_TextureWeight); 
ES 2は一応の解決策のようなものであるかもしれないので、サンプリング部の電流特性をイントロスペクトする手段を持ちません u_TextureWeight1.0とき u_TextureWeight0.0v_Color*texture2D(u_TextureUnit, v_TextureCoordinates)あるときによう

v_Color*vec4(1.0)に評価されます。

あなたが本当にハックであることを探している場合、あなただけのシェーダで再びそれらを負イメージとしてあなたのテクスチャをアップロードして、負のかもしれません。そして、明らかとして

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

あなたは、サンプリング部からvec4(0.0)を取得している場合テクスチャが付いていないので、v_Color1.0を掛け合わせることになります。

+1

私は最初の非ハッキリ解決策に固執します:)または2つの異なるシェーダを使用してください。 – 246tNt

+0

確かに。最も簡単なことは、まず、常に。性能がそれを必要とする程度にまで複雑性を加える。 – Tommy

+0

理想的な回答、ありがとう – Mohamed

関連する問題