opengl - glUniformLocation 数组
问题描述
我正在尝试将数组的统一位置保存到我的 Shader 类中的 std::map 中。
我的顶点着色器有一个到 mat4 的数组制服。
uniform mat4 bone_matrices[32];
在以下代码中,骨骼矩阵名称显示为 bone_matrices[0]。所以我只得到第一个数组成员的位置。[我认为其他是顺序的。]
class Shader
{
...
private:
GLuint mi_program;
std::map<std::string, GLint> m_maplocations;
};
void Shader::mapLocations()
{
GLint numUniforms = 0;
const GLenum properties[5] = {GL_BLOCK_INDEX, GL_TYPE, GL_NAME_LENGTH, GL_LOCATION, GL_ARRAY_SIZE};
glGetProgramInterfaceiv(mi_program, GL_UNIFORM, GL_ACTIVE_RESOURCES, &numUniforms);
for(int unif = 0; unif < numUniforms; ++unif)
{
GLint values[5];
glGetProgramResourceiv(mi_program, GL_UNIFORM, unif, 5, properties, 5, NULL, values);
// Skip any uniforms that are in a block.
if(values[0] != -1)
continue;
std::string nameData;
nameData.resize(values[2]);
if(values[4] > 1)
{
// **have an array here**
}
glGetProgramResourceName(mi_program, GL_UNIFORM, unif, nameData.size(), NULL, &nameData[0]);
std::string name(nameData.begin(), nameData.end() - 1);
m_maplocations.insert(std::pair<std::string, GLint>(name, values[3]));
}
}
如何迭代 bone_matrices 数组,获取它们的名称:bone_matrices[0]、bone_matrices[1]、...和位置。谢谢..
解决方案
如何迭代 bone_matrices 数组,获取它们的名称:bone_matrices[0]、bone_matrices 1、...和位置。
有一种制服:bone_matrices
. 这个uniform是一个基本类型的数组,所以它被认为是一个单一的资源。每个数组元素都有一个位置,但仍然只有一个制服。
如果要测试是否排列了制服,请使用GL_ARRAY_SIZE
属性获取制服的大小。如果该值大于 1,则可以通过循环查询每个数组元素的位置。
说了这么多:
我正在尝试将数组的统一位置保存到我的 Shader 类中的 std::map 中。
请不要这样做。首先,std::map
基于 - 的代码不会比glGetUniformLocation
or快glGetProgramResourceLocation
。因此,如果您要不断地通过字符串名称查询制服,您不妨只使用现有的 API。
其次,由于您使用的是程序资源,这是 GL 4.3 的一项功能,我必须假设您可以访问明确的统一位置。因此,您应该将制服分配给着色器中的特定位置,然后您根本不需要查询任何内容。
即使您正在编写一个必须与用户提供给您的任何东西一起工作的程序,他们仍然最好提供特定的位置。
我的意思是这个。假设您期望用户将提供一个名为 的矩阵数组bone_matrices
。因此,将您的期望更改为用户将在某个特定的统一位置 X 处提供矩阵数组。
是的,这意味着您必须划分统一空间。但这比运行每个着色器来查询其数据要好得多。您不必拥有从字符串到位置的地图;您只需拥有它期望的位置。
推荐阅读
- java - 使用反射根据接收到的参数访问属性 - Java
- c# - 从非根目录加载程序集
- java - 如何将文件从服务器(Spring 框架)上传到其他服务器(例如:112.12.15.2)
- c# - 序列的逆补
- reactjs - 反应原生如何在 tabBarOnPress 上重新渲染刷新屏幕
- matlab - 在 Matlab 的数据数组中添加缺失/额外的值
- angular - 无法通过其中一种方法访问 authService 中的公共属性
- dart - Bloc 无法在对话框中返回数据
- c# - 添加多个对象列表然后在datagridview中查看它们,gridview的所有行都将传递给web方法的数组对象?
- java - 有没有办法将 eclipse 项目编译或移植到 MIDlet 中?