La matriz de Float no se conecta con OpenGL Shader

Primero intenté usar un flotador [] [] para get la altura de un área en particular, pero OpenGL no quería hacerlo y era mucho más simple usar un set plano multidimensional en su lugar. Sin embargo, esa matriz no está funcionando ahora. Comprobé la matemática de cómo estaba agregando las carrozas y eran correctas: las agregué en la class TerrainShader con la misma forumla que a continuación ([x * MAX_X + y] AKA x * 128 + y) pero el resultado sigue siendo el lo mismo que antes con la matriz doble.

#version 400 core in vec2 pass_textureCoordinates; in vec3 surfaceNormal; in vec3 toLightVector; in vec3 toCameraVector; in vec3 coordinates; out vec4 out_Color; uniform sampler2D backgroundTexture; uniform sampler2D sandTexture; uniform sampler2D stoneTexture; uniform vec3 lightColour; uniform float biomeMap[128 * 128 + 128]; void main(void) { vec4 textureColour = texture(backgroundTexture, pass_textureCoordinates); float c = biomeMap[int(pass_textureCoordinates.x * 128 + pass_textureCoordinates.y)]; if(c < 110) textureColour = texture(sandTexture, pass_textureCoordinates); else if(c < 150) textureColour = texture(stoneTexture, pass_textureCoordinates); vec3 unitNormal = normalize(surfaceNormal); vec3 unitLightVector = normalize(toLightVector); float nDot = dot(unitNormal, unitLightVector); float brightness = max(nDot, 0.1); vec3 diffuse = brightness * lightColour; out_Color = vec4(diffuse,1.0) * textureColour; } 

Lo anterior es mi terrainFragmentShader y debajo está la class TerrainShader.

 public class TerrainShader extends ShaderProgram { private static final String VERTEX_FILE = "src/shaders/terrainVertexShader.txt"; private static final String FRAGMENT_FILE = "src/shaders/terrainFragmentShader.txt"; private int location_transformationMatrix; private int location_projectionMatrix; private int location_viewMatrix; private int location_lightPosition; private int location_lightColour; private int location_plane; private int location_backgroundTexture; private int location_sandTexture; private int location_stoneTexture; private int location_biomeMap[]; public TerrainShader() { super(VERTEX_FILE, FRAGMENT_FILE); } @Override protected void bindAttributes() { super.bindAttribute(0, "position"); super.bindAttribute(1, "textureCoordinates"); super.bindAttribute(2, "normal"); } @Override protected void getAllUniformLocations() { location_transformationMatrix = super.getUniformLocation("transformationMatrix"); location_projectionMatrix = super.getUniformLocation("projectionMatrix"); location_viewMatrix = super.getUniformLocation("viewMatrix"); location_lightPosition = super.getUniformLocation("lightPosition"); location_lightColour = super.getUniformLocation("lightColour"); location_plane = super.getUniformLocation("plane"); location_backgroundTexture = super.getUniformLocation("backgroundTexture"); location_sandTexture = super.getUniformLocation("sandTexture"); location_stoneTexture = super.getUniformLocation("stoneTexture"); location_biomeMap = new int[Terrain.VERTEX_COUNT * Terrain.VERTEX_COUNT + Terrain.VERTEX_COUNT]; for(int i = 0; i < location_biomeMap.length; i++) { location_biomeMap[i] = super.getUniformLocation("biomeMap[" + i + "]"); } } public void loadClipPlane(Vector4f plane) { super.loadVector(location_plane, plane); } public void connectTextures() { super.loadInt(location_backgroundTexture, 0); super.loadInt(location_sandTexture, 1); super.loadInt(location_stoneTexture, 2); } public void loadTransformationMatrix(Matrix4f matrix) { super.loadMatrix(location_transformationMatrix, matrix); } public void loadLight(Light light) { super.loadVector(location_lightPosition, light.getPosition()); super.loadVector(location_lightColour, light.getColour()); } public void loadViewMatrix(Player camera) { Matrix4f viewMatrix = Maths.createViewMatrix(camera); super.loadMatrix(location_viewMatrix, viewMatrix); } public void loadProjectionMatrix(Matrix4f projection) { super.loadMatrix(location_projectionMatrix, projection); } public void loadBiomes(float[][] biomeMap) { for(int x = 0; x < Terrain.VERTEX_COUNT; x++) { for(int y = 0; y < Terrain.VERTEX_COUNT; y++) { super.loadFloat(location_biomeMap[x * Terrain.VERTEX_COUNT + y], biomeMap[x][y] * 128 + 127); } } } } 

Por lo que puedo decir, el código se bloquea por completo cuando trata de hacer flotar nuestro de biomeMap . No aparece ningún error, sin embargo, es como si se llama a un return y no se carga color para el terreno, lo que lo deja en blanco como si fuera invisible. ¿Por qué está haciendo esto y cómo puedo solucionarlo?

Hay un límite de cuántos uniformes puedes tener. Puede consultar la cantidad exacta usando glGetIntegerv con GL_MAX_XXX_UNIFORM_COMPONENTS donde XXX es el nombre de la etapa de sombreado. Este límite es bastante generoso, pero aún se garantiza solo 1024 en OpenGL 3.0+.

Incluso si no hubiera otro error en su código y su máquina tuviera un límite lo suficientemente alto como para acomodar 128 * 129 ranuras, podría no funcionar en otras máquinas debido a dichas limitaciones. Además, siempre debe verificar los errores de compilation / vinculación del sombreador usando glGetShaderiv / glGetShaderInfoLog .
Una alternativa a su implementación con una matriz de flotación uniforme podría ser, por ejemplo, texturas que deberían ser lo suficientemente grandes como para acomodar la matriz en cualquier dispositivo.