‘error: las matrices sampler indexadas con expresiones no constantes están prohibidas en GLSL 1.30 y posteriores’ en el sombreador de fragmentos

Estoy escribiendo el siguiente fragmento de sombreado para un motor de juego:

#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; } 

La línea texColor = texture(textures[tid], fs_in.uv); hace que las ‘matrices de muestreadores indexadas con expresiones no constantes estén prohibidas en la expresión GLSL 1.30 y posteriores’ al comstackr el sombreado.

El sombreador de vértices si es necesario es:

 #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; } 

En GLSL 3.3, la indexación para matrices de muestras solo está permitida por una expresión constante constante (consulte GLSL 3.3 Spec, Sección 4.1.7 ).

En una versión más moderna, a partir de GLSL 4.0, se permite indexar matrices de muestreadores mediante expresiones uniformes dinámicas (consulte las Especificaciones de GLSL 4.0, Sección 4.1.7 )

Lo que realmente intentas es indexar la matriz por una variación que es simplemente imposible. Si es absolutamente inevitable hacerlo, puede empaquetar las texturas 2D en una textura de matriz 2D o en una textura 3D y usar el índice para abordar la capa (o la tercera dimensión) de la textura.