Opengl UBO固定位置不工作

Opengl UBO固定位置不工作,opengl,fragment-shader,Opengl,Fragment Shader,我的碎片着色器有一个神秘问题 如果我指定UBO的位置,它不会显示任何内容。没有location=0的相同着色器可以正常工作-在这种情况下,它的位置为0,因为glGetUniformBlockIndex(hProgram,“color”)返回。使用location=0返回-1 #version 440 layout(location = 0) in vec2 uv; layout(location = 4) uniform sampler2D tex; layout(std140, bindin

我的碎片着色器有一个神秘问题

如果我指定UBO的位置,它不会显示任何内容。没有
location=0的相同着色器可以正常工作-在这种情况下,它的位置为0,因为
glGetUniformBlockIndex(hProgram,“color”)
返回。使用
location=0
返回
-1

#version 440

layout(location = 0) in vec2 uv;
layout(location = 4) uniform sampler2D tex;
layout(std140, binding=3, location=0) uniform color{
  vec4 inColor;
};

layout(location = 0) out vec4 outColor;

void main(){
  outColor = inColor * texture2D(tex, uv);
}

这根本不是有效的GLSL。
位置
限定符不能应用于统一块

第4.4节“布局限定符”中的表格列出了仅对独立变量有效的
位置=
限定符,但不适用于
统一
情况下的块或块成员(允许在
输入
/
输出
接口块中使用,但情况完全不同)

实际上,UBO块的
位置
到底意味着什么还完全不清楚。UBO没有位置,其中的变量也没有。这些变量仅通过它们在缓冲区内的字节偏移量来处理,该偏移量由实现或所选布局的规则定义(如
std140

另见本手册第1期

(1) 统一缓冲区中元素的偏移量与 统一地点

已解决:在胶状图中使用传统的均匀位置 访问专用统一存储的API。此API不允许 使用
glUniform
更新存储在统一块中的统一。 相反,它使用各种方法来更新缓冲区对象 公开缓冲区对象中统一的字节偏移量。所以 简而言之,均匀位置和均匀偏移是类似的概念 但不相关


总结:着色器甚至不应该使用
位置
限定符进行编译。可能没有。

我知道这类错误,通常看起来像是驱动程序错误。像这样:很难调试。我假设最后一条消息(
layout=0
)是一个打字错误,应该读
location=0
?感谢您的详细回答。使用
#version 440
编译成功-但Nvidia编译并执行几乎所有:D。使用
#version 430
失败,错误为“至少需要440或扩展名XYZ”。