Если у меня есть фрагмент-шейдер, который выглядит так:
#version 450
#define MAX_NUM_LIGHTS 10
#define NUM_CASCADES 6
uniform sampler2D depthMap[NUM_CASCADES][MAX_NUM_LIGHTS];
...
Как мне отправить значение из моей программы на C++ через glUniform... в шейдер?
Если бы у меня было только:
#define MAX_NUM_LIGHTS 10
uniform sampler2D depthMap[MAX_NUM_LIGHTS];
...
Я бы сделал так:
...
GLint tmp[MAX_NUM_LIGHTS];
for(GLint i = 0; i<MAX_NUM_LIGHTS; i++)
{
tmp[i] = 2+i; // all textures up to GL_TEXTURE1 are already bound.
glActiveTexture(GL_TEXTURE2+i);
glBindTexture(GL_TEXTURE_2D, depthMapID[i]);
}
glUniform1iv(model.depthMap_UniformLocation, MAX_NUM_LIGHTS, tmp);
glUniform1iv не работает для многомерных массивов, и я не смог найти подходящую здесь функцию: https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glUniform.xml или: https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_arrays_of_arrays.txt





Массивы массивов в OpenGL работают как массивы структур. Это означает, что каждый массив массива имеет индивидуальное единое расположение и, следовательно, индивидуальное имя. Однако, как только вы перейдете к массиву базовых типов, он будет действовать как обычный массив базовых типов: вы можете влить множество значений в первое место этого массива.
В вашем случае у вас есть 6 униформ с именами от «depthMap [0]» до «depthMap [5]». Каждый из них представляет собой массив из 10 элементов.