2012-02-26 186 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)。 – 2012-02-26 21:40:06

+0

你的意思是說,如果你用'if(true)'替換'if(uUseTexture == 1)',那麼相同的着色器代碼可以工作嗎? – rotoglup 2012-02-26 21:43:20

回答

5

沒有彈簧想到馬上在你的代碼一眼,但我想帶一會兒,並指出這個用例可以被覆蓋而不需要if語句。例如,讓我們把uUseTexture作爲一個浮動的,而不是一個int(你可以在着色器投,但這個更有趣):

//頂點

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 2012-02-26 23:00:07