我正在尝试学习如何使用统一缓冲区对象,阅读 OpenGL Superbible 5。我的着色器中有一个统一 block :
layout(std140) uniform SkeletonBlock
{
vec3 position[64];
vec4 orientation[64];
} Skeleton;
现在我获取索引的代码是:
const GLchar* uniformNames[2] =
{
"SkeletonBlock.position",
"SkeletonBlock.orientation"
};
GLuint uniformIndex[2];
glGetUniformIndices(shaderProgram, 2, uniformNames, uniformIndex);
出于某种原因,此电话给了我一个非常高的索引(始终为 4294967295),我不确定为什么。我觉得我错过了一些明显的东西。 OpenGL 正在报告一个事件的统一 block ,这是正确的,最多允许 15 个。在这部分代码之前或之后都没有事件的错误标志。有什么可能出错的建议吗?
最佳答案
layout(std140) uniform SkeletonBlock
{
vec3 position[64];
vec4 orientation[64];
} Skeleton;
下面是这个定义:
- 有一个名为
SkeletonBlock
的统一 block 。 - 它包含一个由 64 个
vec3
组成的数组,称为position
,然后是一个由 64 个vec4
组成的数组,称为orientation
. - 其所有成员的名称在 GLSL 中由标识符
Skeleton
限定。
注意最后一部分。在 GLSL 中,仅在 GLSL 中,position
数组由 Skeleton.position
标识。在 C++ 中,数组由 SkeletonBlock.position
或 SkeletonBlock.position[0]
标识。这里的重点是 from C++ code you use the block name SkeletonBlock
作为前缀,而不是实例名称 Skeleton
。
SkeletonBlock
block 有一个索引,可以用 glGetUniformBlockIndex
查询(注意“ block ”一词的使用和“索引”中缺少复数)。个别制服成员也有索引,但它们是制服列表的索引。并且必须正确命名这些变量。如果统一 block 有实例名称,则统一 block 成员必须以 block 名称为前缀,而不是实例名称。
如果您将这些名称传递给 OpenGL 函数但未获得有效索引,那么您可能遇到了驱动程序错误。
关于c++ - glGetUniformIndices 没有返回正确的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794862/