GLSL 2.0颜色和纹理

时间:2012-02-26 21:06:28

标签: glsl webgl

嗨,我是GLSL的新手,我遇到了一些问题。

我正在尝试创建一对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;
    }

1 个答案:

答案 0 :(得分: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语句时,很有可能这就是着色器编译器在幕后做的事情。这种硬件通常效率更高。