2012-02-26 27 views
3

こんにちは、私はGLSLを初めて使っています。私はいくつか問題があります。GLSL 2.0色とテクスチャ

色やテクスチャのどちらかを使用するためにGLSLシェーダのペアを作成しようとしていますが、何か間違っている必要があります。 問題は、uUseTextureを0(色を示すはずです)に設定すると動作しない(オブジェクトが色付けされていない)ことです。私は、色分けされたコードが別々に動作することを知っています。なぜ、if文を使ってもうまくいかない理由は何ですか?ここで

はコードです:

//フラグメント

precision mediump float; 

uniform int uUseTexture; 
uniform sampler2D uSampler; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 

    if(uUseTexture == 1) { 
     gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)); 
    } else { 
     gl_FragColor = vColor; 
    } 

} 

//頂点

attribute vec3 aVertexPosition; 
attribute vec4 aVertexColor; 
attribute vec2 aTextureCoord; 

uniform int uUseTexture; 
uniform mat4 uMVMatrix; 
uniform mat4 uPMatrix; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 

    if(uUseTexture == 1) { 
     vTextureCoord = aTextureCoord; 
    } else { 
     vColor = aVertexColor; 
    } 
+0

この 'VEC2(vTextureCoord.s、vTextureCoord.t)は' 'vTextureCoord.st'であるべきです。あなたはGLSLでどのように[swizzle masks](http://www.opengl.org/wiki/GLSL_Types#Swizzling)が動作するかを調べるべきです。 –

+0

'if(uUseTexture == 1)'を 'if(true)'に置き換えた場合、同じシェーダコードが機能することを意味しますか? – rotoglup

答えて

5

何もすぐにあなたのコードの上にかすめる心にスプリングませんが、私が利用したいと思いますif文を必要とせずにこのユースケースをカバーできることを指摘します。たとえば、のは、(あなたがシェーダでそれを唱えられるが、これはもっと面白いです)フロートの代わりにintとしてuUseTextureを扱うみましょう:

//頂点

attribute vec3 aVertexPosition; 
attribute vec4 aVertexColor; 
attribute vec2 aTextureCoord; 

uniform mat4 uMVMatrix; 
uniform mat4 uPMatrix; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 
    // It may actually be faster to just assign both of these anyway 
    vTextureCoord = aTextureCoord; 
    vColor = aVertexColor; 
} 

//フラグメント

uniform float uUseTexture; 
uniform sampler2D uSampler; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 
    // vTextureCoord is already a vec2, BTW 
    vec4 texColor = texture2D(uSampler, vTextureCoord) * uUseTexture; 
    vec4 vertColor = vColor * (1.0 - uUseTexture); 
    gl_FragColor = texColor + vertColor; 
} 

今すぐuUseTextureは、使用したい各色のソースのどれだけのモジュレータとして機能します。また、0.5に設定してハーフテクスチャ/ハーフ頂点カラーを取得できるという点でより柔軟です!

あなたを驚かせるかもしれ事は、これはあなたがそのようにif文を使用するときに、シェーダコンパイラはとにかく裏でやっていることであることは良い可能性があるということです。通常、ハードウェアの方が効率的です。

+0

、シェーダとは何の関係も問題が見つからなかったあなたの迅速な対応のおかげで、それは私がアイテムのサイズ22の代わりに、2とテクスチャ座標をバッファリングして判明...私はより多くの睡眠に必要:) とに感謝変調器のヒントは、それを試してみる:) – brunom

関連する問題