glGetUniformLocation 使用 loop 获取数组中的元素
glGetUniformLocation get elements in an array using loop
我有一个具有多个光源的着色器,我想获取每个光源属性的统一位置,而不必为每个光源手动键入它。但是,由于glGetUniformLocation使用字符串查找制服,因此我无法做到这一点。
for (unsigned int i = 0; i < MAX_LIGHTS; ++i) {
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_ON + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].on");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_TYPE + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].type");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_POSITION + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].position_cameraspace");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_COLOR + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].color");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_POWER + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].power");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_KC + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].kC");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_KL + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].kL");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_KQ + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].kQ");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_SPOTDIRECTION + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].spotDirection");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_COSCUTOFF + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].cosCutoff");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_COSINNER + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].cosInner");
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_EXPONENT + n] = glGetUniformLocation(shaderProgramID[PHONG], "lights[n].exponent");
}
例如,由于"lights[n].on"是一个常量字符*,glGetUniformLocation找不到它,因为n不是数字。我怎样才能让它像那样循环?提前谢谢。
您只需要根据需要动态构造字符串。
//Helper function that takes a `string`.
GLint GetUniformLocation(GLuint program, const std::string &name)
{
return glGetUniformLocation(program, name.c_str());
}
for (unsigned int i = 0; i < MAX_LIGHTS; ++i) {
shaderParameters[PHONG * U_TOTAL + U_LIGHT0_ON + n] =
GetUniformLocation(shaderProgramID[PHONG], "lights[" + std::tostring(i) + "].on");
//And so forth.
}
注意:上述假设您使用的是最新版本的C++。
然而,正如246Nt所建议的那样,使用具有std140
布局的最终受益人将使更改这些数据变得更加容易。但是,如果你执着于使用非块制服,如果你有 GL 4.3 或 ARB_explicit_uniform_location,你可以使用明确的制服位置。这样,您根本不需要查询位置;您知道它们是什么,因为您在着色器中设置了这些位置。数组/结构的每个组件的位置将按顺序分配给每个子成员。
我建议使用UBO:https://www.opengl.org/wiki/Uniform_Buffer_Object
通过这种方式,您基本上只需通过单个均匀块一次"发送"所有轻参数。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何将元素添加到数组的线程安全函数?
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输出没有重复元素的动态数组(收缩数组)C++
- 数组中最大的非重复元素
- 数组元素打印的递归方法
- 对字符数组中的元素执行逐位操作
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 通过交换元素使数组相同
- 按平均值替换数组中的元素
- 打印矢量数组中的所有元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何将元素从向量转移到新数组?
- 如何在向量数组中插入元素?
- 为什么 2 个相同数组的元素彼此相等
- C++ 中的二维整数数组,每行中的元素数量不均匀