c++ - glGetUniformIndices 没有返回正确的索引

标签 c++ opengl opengl-3

我正在尝试学习如何使用统一缓冲区对象,阅读 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.positionSkeletonBlock.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/

相关文章:

C++ 随机数生成器不是随机的

c++ - 具有缩放拉伸(stretch)纵横比的 glm 旋转

c++ - GL_R32I TexImage2D 上传不正确

c++ - glVertexAttribPointer 问题(OpenGL 3.x 向前兼容上下文)

opengl - 用于遮挡剔除的分层 Z 缓冲

OpenGL 4.x 学习资源

c++ - 为什么在其他函数中声明的函数不参与参数相关查找?

c++ - Qt 中的多模态窗口

c++ - 编译器资源管理器和 GCC 有不同的输出

math - 4元素向量(3D数学)