我正在为游戏引擎编写以下片段着色器:
#version 330 core
layout (location = 0) out vec4 color;
uniform vec4 colour;
uniform vec2 light_pos;
in DATA
{
vec4 position;
vec2 uv;
float tid;
vec4 color;
} fs_in;
uniform sampler2D textures[32];
void main()
{
float intensity = 1.0 / length(fs_in.position.xy - light_pos);
vec4 texColor = fs_in.color;
if(fs_in.tid > 0.0){
int tid = int(fs_in.tid + 0.5);
texColor = texture(textures[tid], fs_in.uv);
}
color = texColor * intensity;
}
线路texColor = texture(textures[tid], fs_in.uv);
导致编译着色器时“GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组”表达式。
如果需要的话,顶点着色器是:
#version 330 core
layout (location = 0) in vec4 position;
layout (location = 1) in vec2 uv;
layout (location = 2) in float tid;
layout (location = 3) in vec4 color;
uniform mat4 pr_matrix;
uniform mat4 vw_matrix = mat4(1.0);
uniform mat4 ml_matrix = mat4(1.0);
out DATA
{
vec4 position;
vec2 uv;
float tid;
vec4 color;
} vs_out;
void main()
{
gl_Position = pr_matrix * vw_matrix * ml_matrix * position;
vs_out.position = ml_matrix * position;
vs_out.uv = uv;
vs_out.tid = tid;
vs_out.color = color;
}
在 GLSL 3.3 中,采样器数组的索引仅允许积分常量表达式 (see GLSL 3.3 规范,第 4.1.7 节).
在更现代的版本中,从 GLSL 4.0 开始,允许通过以下方式索引采样器数组动态统一表达式 (see GLSL 4.0 规范,第 4.1.7 节)
您实际上正在尝试的是通过变化来索引数组,这是根本不可能的。如果这样做绝对不可避免,您可以将 2d 纹理打包到 2d 数组纹理或 3d 纹理中,并使用索引来寻址纹理的图层(或第 3 维)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)