在glsl中,将输入变量用作数组的索引不起作用

时间:2018-10-02 06:50:58

标签: java opengl glsl

我有一个简单的glsl片段着色器,如下所示:

#version 400 core

in vec2 textureCoord;
flat in int faceTexture;

out vec4 out_Colour;

uniform sampler2D[] TEXTURES;

void main(void) {
    out_Colour = texture(TEXTURES[faceTexture], textureCoord);
}

哪个产生这张图片:

显然,纹理不起作用。输入int'faceTexture'等于1。这可以使用此片段着色器证明:

#version 400 core

in vec2 textureCoord;
flat in int faceTexture;

out vec4 out_Colour;

uniform sampler2D[] TEXTURES;

void main(void) {
    //If faceTexture is 1 make the colour blue, otherwise make it green.
    if (faceTexture == 1)
        out_Colour = vec4(0, 0, 1, 1);
    else
        out_Colour = vec4(0, 1, 0, 1);
}

运行时会产生以下结果:

(当输入等于1时我们会期望的。)

但是,当我们像这样对其中的一个进行硬编码时:

#version 400 core

in vec2 textureCoord;
flat in int faceTexture;

out vec4 out_Colour;

uniform sampler2D[] TEXTURES;

void main(void) {
    //We don't use the faceTexture int here
    out_Colour = texture(TEXTURES[1], textureCoord);
}

纹理有效!

为什么当我使用输入变量作为数组的索引时,纹理不起作用,但是,当我将相同的值硬编码到着色器中时,纹理可以正常工作吗?如何使输入变量与数组配合使用?

注意:如果您声明一个等于1的常量,该纹理也可以工作,但是如果您声明一个等于1的非常量变量并按如下方式使用它,则纹理将不起作用:

int test = 1;
out_Colour = texture(TEXTURES[test], textureCoord);

这将产生与第一个示例相同的结果。

0 个答案:

没有答案