首页 > 解决方案 > 用于数组数组的 opengl glUniform (ARB_arrays_of_arrays)

问题描述

如果我有一个看起来像这样的片段着色器:

#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

标签: c++copengl

解决方案


OpenGL 中的数组数组就像结构数组一样工作。这意味着每个数组数组都有一个单独的统一位置,因此有一个单独的名称。然而,一旦你得到一个基本类型的数组,它就像一个普通的基本类型数组:你可以将大量的值放入该数组的第一个位置。

在您的情况下,您有 6 个制服,分别命名为“depthMap[0]”到“depthMap[5]”。每一个都是一个 10 元素的数组。


推荐阅读