我的片段着色器出现了一个神秘的问题。
如果我指定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);
}
答案 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)统一缓冲区中元素的偏移如何与...相关 统一的地点?
已解决:glUniform中使用了传统的统一位置 用于访问私有统一存储的API。此API不允许 使用
std140
来更新存储在统一块中的制服。 相反,它使用各种方法来更新缓冲区对象,以及 公开缓冲区对象中制服的字节偏移量。所以, 简而言之,均匀的位置和均匀的偏移是类似的概念 但是没有关系。
总结:您的着色器甚至不应该使用那里的glUniform
限定符进行编译。它可能没有。