Opengl UBO/SSBO动态索引和无绑定纹理
在GLSL片段着色器中,我有以下奇怪的行为:我试图传递一个带有结构数组的UBO(也尝试了SSBO),其中每个结构看起来如下所示:Opengl UBO/SSBO动态索引和无绑定纹理,opengl,glsl,nvidia,Opengl,Glsl,Nvidia,在GLSL片段着色器中,我有以下奇怪的行为:我试图传递一个带有结构数组的UBO(也尝试了SSBO),其中每个结构看起来如下所示: layout(location = 0) uniform uint u_index; layout (std430, binding = 2) buffer MaterialBlock { u64vec4 data[]; }material; void main() { oColor = DoThing(samp
layout(location = 0) uniform uint u_index;
layout (std430, binding = 2) buffer MaterialBlock {
u64vec4 data[];
}material;
void main()
{
oColor = DoThing(sampler2D(material.data[0].x),usampler2D(material.data[0].z),..params...);
}
struct MaterialData
{
uint64_t data[4];
};
此处u64vec4
包含以下值:
x-uint64_t无绑定纹理句柄A
y-uint64_t无黏结纹理控制柄B
z-uint64_t无绑定纹理句柄C
w-两个uint32\u t压缩为一个uint64\u t,带有一些额外数据
我有一个片段着色器中的代码,看起来是这样的(抱歉,我不能把整个东西都放出来,因为这是商业作品,但这个示例准确地说明了问题:
vec4 DoThing( sampler2D aTex, usampler2D cTex, float2 paramA, float4 paramB, float4 paramC)
{
uint4 cTexData= texelFetch(cTex, int2(paramA.x,paramA.y),0);
vec4 color = vec4(0.0);
for (int i= 0; i< int(cTexData.x); i++)
{
color += texelFetch(aTex, int2(paramB.x,paramB.y),0);
//continue doing smth with color ..
}
//some more code..
return color;
}
void main()
{
oColor = DoThing(sampler2D(material.data[u_index].x),usampler2D(material.data[u_index].z),..params...);
}
失败。当我说“失败”时,这意味着cTexData接收到错误的数据,这会导致for()内部出现很长的(某种无限循环),这会将显示冻结20-30秒,这让我相信它是从垃圾中采样的
但是如果我用一个常量值索引到SSBO或(UBO),类似这样的东西:
layout(location = 0) uniform uint u_index;
layout (std430, binding = 2) buffer MaterialBlock {
u64vec4 data[];
}material;
void main()
{
oColor = DoThing(sampler2D(material.data[0].x),usampler2D(material.data[0].z),..params...);
}
struct MaterialData
{
uint64_t data[4];
};
工作!所有的纹理都是正确的样本
我一直在深入研究OpenGL规范,但我找不到任何可以表明禁止使用uniform索引到UBO的东西。但它就是不起作用。我不能使用Nvidia Nsight/Graphics进行配置,因为它们还不支持此GPU模型,renderDoc也不支持ARB_bindless_纹理
我的系统规格:Win10 Pro、Nvidia Quadro P2000、OpenGL 4.5
PS:在SSBO使用140布局的UBO之前,但决定尝试SSBO,看看问题是否与数据布局有关。不,同样的事情。在客户端,结构如下所示:
layout(location = 0) uniform uint u_index;
layout (std430, binding = 2) buffer MaterialBlock {
u64vec4 data[];
}material;
void main()
{
oColor = DoThing(sampler2D(material.data[0].x),usampler2D(material.data[0].z),..params...);
}
struct MaterialData
{
uint64_t data[4];
};
我还在着色器代码内部运行了一次检查,以确保u_index
的值等于0。它等于0。因此我不知道动态索引在这里失败的原因
更新:偶然发现这个问题,我确实使用了#扩展GL\u NV\u gpu\u着色器5:require
更新1:
经过几次测试,它看起来像NVIDIA驱动程序实现错误。
我将在收到他们的驾驶员团队对此问题的回复后进行更新