Opengl UBO固定位置不工作
我的碎片着色器有一个神秘问题 如果我指定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
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”。