【问题标题】:GLSL 2.0 Color and TextureGLSL 2.0 颜色和纹理
【发布时间】:2012-02-27 05:46:20
【问题描述】:

您好,我是 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;
    }

【问题讨论】:

  • 这个vec2(vTextureCoord.s, vTextureCoord.t) 应该是vTextureCoord.st。您应该查看swizzle masks 在 GLSL 中的工作方式。
  • 你的意思是如果你把if(uUseTexture == 1)替换成if (true),同样的着色器代码可以工作吗?

标签: glsl webgl


【解决方案1】:

浏览您的代码时,没有什么会立即浮现在脑海中,但我想花一点时间指出,无需 if 语句即可涵盖此用例。例如,让我们将 uUseTexture 视为 float 而不是 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 语句时,很有可能这就是着色器编译器在幕后所做的事情。这种方式通常对硬件更有效。

【讨论】:

  • 感谢您的快速响应,找到了问题,与着色器无关,事实证明我正在使用项目大小 22 而不是 2 来缓冲纹理坐标...我需要多睡觉: )感谢调制器提示,将尝试一下:)
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多