Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLGetUniformIndicates未返回正确的索引_C++_Opengl_Opengl 3 - Fatal编程技术网

C++ GLGetUniformIndicates未返回正确的索引

C++ GLGetUniformIndicates未返回正确的索引,c++,opengl,opengl-3,C++,Opengl,Opengl 3,我正在阅读OpenGL Superbible 5,试图学习如何使用统一缓冲区对象。我的着色器中有一个统一块: layout(std140) uniform SkeletonBlock { vec3 position[64]; vec4 orientation[64]; } Skeleton; 现在,我获取索引的代码是: const GLchar* uniformNames[2] = { "SkeletonBlock.position", "Ske

我正在阅读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个。在这段代码之前或之后都没有激活的错误标志。有什么可能出错的建议吗?

我相信你会想要的

常量GLchar*uniformNames[2]= { 骨架,位置, 骨骼定向 }; 根据GLSL等C风格语言的语义,您正在声明一个名为Skeleton的uniform SkeletonBlock类型的变量。因此,SkeletonBlock.position的形式为.,您需要

OpenGL文档说,如果您给GLGetUniformIndicates一个错误的统一名称,那么它将从GLGetUniformIndicates获得一个无效的GL索引。根据这个参数检查每个返回的索引可能是明智的。我敢打赌GL_无效_索引==-1

此外,这个数字4294967295是32位-1 twos补码的无符号解释

layout(std140) uniform SkeletonBlock  
{  
    vec3 position[64];  
    vec4 orientation[64];  
} Skeleton;
这一定义的内容如下:

有一个名为SkeletonBlock的统一块。 它包含一个称为位置的64个向量数组,后跟一个称为方向的64个向量数组。 其所有成员的名称在GLSL中由标识符骨架限定。 注意最后一部分。在GLSL中,并且仅在GLSL中,位置数组由Skeleton.position标识。在C++中,数组由Simulink Buffor或StangnBooad来标识。位置[0 ]。这里的要点是SkeletonBlock作为前缀,而不是实例名称Skeleton

SkeletonBlock块有一个可以用glGetUniformBlockIndex查询的索引。注意单词block的使用和索引中缺少多个。个别制服成员也有索引,但它们是制服列表中的索引。这些变量必须正确命名。如果统一块具有实例名称,则统一块成员的前缀必须是块名称,而不是实例名称


如果将这些名称传递给OpenGL函数而没有获得有效的索引,则可能存在驱动程序错误。

如果未引用统一块变量,即在着色器的GLSL源代码中使用,则可能会遇到此问题。作为优化,着色器源代码编译器将从着色器中删除变量。然后,当调用glGetUniformIndicates时,将返回GL\u INVALID\u索引。

glGetError返回什么?这个非常高的索引是-1的同义词,这让我觉得OpenGL试图告诉你一些事情。在调用GLGetUniformIndicates之前和之后,glGetError不会返回任何错误。位置-1表示着色器中不存在一致性。你在实际着色器中的任何位置都使用这些一致性吗?GLSL编译器可能正在优化它们。是的,它们用于计算顶点的最终位置。感谢您的澄清,但我不知道-1:这个答案是错的。我不知道它是怎么被接受的。前两个句子有三种不同的错误。Nicol Bolas,请解释这个答案是如何错误的,以便我可以进行适当的编辑。我的答案几乎解释了它的所有错误。我提供的代码片段基于OpenGL Superbible中描述如何创建和使用UBO的章节。使用glGetUniformBlockIndex,但发生时间较晚;获取数据后,向UBO填充数据。scpayson的回答解决了我无法检索正确信息以用信息填充缓冲区的问题。《超级圣经》一章是否有我不知道的已知问题?我想知道处理这些问题的正确方法。如果这解决了您的问题,则表明实现中存在错误。在旧版本中解释4.3.7的第4.3.9节:在GLSL中,如果存在实例名称,则在块内声明的名称必须由实例名称限定,但在GLSL之外,如果存在实例名称,则必须由块名称限定。如果不存在实例名称,则成员名称在GLSL中或GLSL之外就足够了。根据,统一块的成员具有索引:链接程序时,每个活动的统一,无论是在命名的统一块中还是在默认块中,都会被分配一个索引。例如,我相信这些索引就是为了确定成员的缓冲区偏移量而传递给glGetActiveUniformsiv的。当然,如果使用std140布局,这是不必要的。@tgnottingham:Uniform块成员有统一的索引,但没有位置。