2012-02-26 188 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