UBO固定位置不起作用

时间:2015-08-11 16:35:44

标签: 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, binding=3, location=0) uniform color{
  vec4 inColor;
};

layout(location = 0) out vec4 outColor;

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

1 个答案:

答案 0 :(得分:1)

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

4.4和#34;布局限定符"中的表格GLSL 4.40 specification列出的location=限定符仅对单个变量有效,但uniform案例中的块或块成员无效(in / {{ 1}}接口块,但这是一个完全不同的故事。)

实际上,完全不清楚UBO块的out甚至是所谓的意味着什么。 UBO没有位置,也没有变量。这些变量仅通过缓冲区内的字节偏移来解决,缓冲区由实现或您选择的布局规则(如location)定义。

另见GL_ARB_uniform_buffer_object specification

中的问题1
  

(1)统一缓冲区中元素的偏移如何与...相关       统一的地点?

     

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

总结:您的着色器甚至不应该使用那里的glUniform限定符进行编译。它可能没有。