opengl glUniform для массивов массивов (ARB_arrays_of_arrays) - PullRequest
0 голосов
/ 14 мая 2018

Если у меня есть фрагмент-шейдер, который выглядит следующим образом:

#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

1 Ответ

0 голосов
/ 14 мая 2018

Массивы массивов в OpenGL работают как массивы структур.Это означает, что каждый массив массива имеет индивидуальное единое местоположение и, следовательно, индивидуальное имя.Однако, как только вы переходите к массиву базовых типов, он действует как обычный массив базовых типов: вы можете вылить множество значений в первое местоположение этого массива.

В вашем случае у вас есть 6униформы с именами «DepthMap [0]» до «DepthMap [5]».Каждый из них представляет собой массив из 10 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...