glGetUniformIndices未返回正确的索引
glGetUniformIndices not returning correct index
我正在学习如何使用统一缓冲区对象,阅读OpenGL Superbible 5。我的着色器中有一个统一的块:
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报告了一个活动的统一块,这是正确的,最大允许值为15。在此代码段之前或之后都没有激活的错误标志。有什么建议吗?
layout(std140) uniform SkeletonBlock
{
vec3 position[64];
vec4 orientation[64];
} Skeleton;
以下是这个定义的含义:
- 存在一个名为
SkeletonBlock
的统一块 - 它包含一个由64个
vec3
组成的称为position
的数组,然后是一个由六十四个vec4
组成的名为orientation
的数组 - 其所有成员的名称在GLSL中由标识符
Skeleton
限定
注意最后一部分。在GLSL中,仅在GLSL中,position
阵列由Skeleton.position
标识。在C++中,数组由SkeletonBlock.position
或SkeletonBlock.position[0]
标识。这里的要点是,在C++代码中,您使用块名SkeletonBlock
作为前缀,而不是实例名Skeleton
。
SkeletonBlock
块有一个可以用glGetUniformBlockIndex
查询的索引(注意"块"一词的使用和"索引"上缺少复数)。制服成员个人也有索引,但它们是制服列表中的索引。这些变量必须正确命名。如果统一块具有实例名,则统一块成员必须以块名为前缀,而不是以实例名为前缀。
如果您将这些名称传递给OpenGL函数,但没有获得有效的索引,那么您可能存在驱动程序错误。
我相信你想要
const GLchar* uniformNames[2] =
{
"Skeleton.position",
"Skeleton.orientation"
};
正如C风格语言(如GLSL)的语义所具有的那样,您正在声明一个名为Skeleton
的类型为uniform SkeletonBlock
的变量。因此,"SkeletonBlock.position"
的形式为<typename>.<member>
,您需要<variable>.<member>
。
OpenGL文档说,当你给glGetUniformIndices()
起一个不好的统一名称时,你会从它得到一个GL_INVALID_INDEX
。将每个返回的索引与此进行比较可能是明智的。我敢打赌GL_INVALID_INDEX == -1
。
此外,这个数字4294967295是32位-1(二进制补码)的无符号解释。
如果着色器的GLSL源代码中没有引用(即使用)统一块变量,则可能会遇到这种情况。着色器源代码编译器将从着色器中完全删除该变量作为优化。然后,当您调用glGetUniformIndices
时,将返回GL_INVALID_INDEX。
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 如何在C++中返回向量的从零开始的索引
- 返回向量的单个索引值
- C++函数返回两个 char 数组的相同索引元素
- 访问包含P的有效索引时返回空格的C++字符串
- 当我在网格/面中实现索引时,为什么它会返回OpenGl错误
- 为什么函数的任何索引处的下标运算符在C++中总是返回1
- 如何使用递归函数返回数组中整数的索引?
- "如何使用C++将字符串的第一个和最后一个索引返回到向量中?
- 当索引为 1 时,_BitScanReverse返回 0,这意味着根据 MS "no set bits were found"
- 从给定索引返回子字符字符串的函数
- 如何使用二叉搜索返回姓氏(给定字符串)的第一个索引/出现次数?
- 在索引中插入节点:链接列表未正确返回列表
- 当c 中的矢量容器过载[]运算符时,我对未定义的索引返回什么
- 通过const函数中的参数索引返回std :: map的值
- 数组使用索引返回最大值
- 为什么boost多索引返回错误的迭代器
- C++快速排序索引0返回-842150451