我有一个简单的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);
这将产生与第一个示例相同的结果。