如果我有一个看起来像这样的片段着色器:
#version 450
#define MAX_NUM_LIGHTS 10
#define NUM_CASCADES 6
uniform sampler2D depthMap[NUM_CASCADES][MAX_NUM_LIGHTS];
...
如何通过glUniform...
将c ++程序中的值发送到着色器?
如果我只是:
#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
答案 0 :(得分:3)
OpenGL中的数组数组就像结构数组一样。这意味着每个数组数组都具有单独的统一位置,因此具有单独的名称。但是,一旦你得到一个基本类型的数组,它就像一个基本类型的常规数组:你可以将很多值倒入该数组的第一个位置。
在你的情况下,你有6件制服,名为“depthMap [0]”到“depthMap [5]”。每个都是一个10元素阵列。