Opengl 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

在GLSL片段着色器中,我有以下奇怪的行为:我试图传递一个带有结构数组的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];
 };
此处
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驱动程序实现错误。 我将在收到他们的驾驶员团队对此问题的回复后进行更新