计算着色器:使用Image2D键入函数参数

时间:2017-02-20 19:24:00

标签: opengl intel compute-shader

我正在编写一个框架,需要提供在image2D类型上定义的一些函数。

但似乎有点难以做到这一点,我找不到任何关于将{'url': 'http://url1', 'iam': 'type 1'} {'url': 'http://url2', 'iam': 'type 2'} {'url': 'http://url3', 'iam': 'type 3'} 传递给函数的文档。

以下是我的问题的最小示例:

image2D

这在我的机载(hd4400)Windows 10上失败了。

更复杂的版本在调用函数时会生成#version 440 layout (local_size_x = 16, local_size_y = 16) in; struct Test { bool empty; }; // Version 1: // fails with 0:11: '' : imageLoad function cannot access the image defined // without layout format qualifier or with writeonly memory qualifier float kernel1(image2D x, Test arg1){ return imageLoad(x, ivec2(1, 1)).x; } // Version 2: // fails with ERROR: 0:16: 'Test' : syntax error syntax error // doesn't fail without the Test struct at second argument float kernel2(layout (r32f) image2D x, Test arg2){ return imageLoad(x, ivec2(1, 1)).x; } layout (binding=0, r32f) readonly uniform image2D globalvar_A; const Test globalvar_f = Test(false); void main(){ // works when other function are commented out imageLoad(globalvar_A, ivec2(1, 1)).x; //kernel1(globalvar_A, globalvar_f); //kernel2(globalvar_A, globalvar_f); } 错误。

在nvidia硬件上,我通过用no overloaded function found键入img来解决这个问题,但这似乎是未记录的nvidia特定名称争论。

有人能用这个看似简单的任务指引我走向正确的方向吗?

更新

我直接从GLSL 4.3 specs第4.10节

中抽取了一个例子
image2D1x32_bindless

并且获取 imageLoad函数无法访问没有布局格式限定符定义的图像。 我可以通过添加#version 430 layout (local_size_x = 16, local_size_y = 16) in; // this works fine without the imageLoad vec4 funcA(restrict image2D a){ return imageLoad(a, ivec2(1, 1));} layout(rgba32f) coherent uniform image2D img2; void main(){ funcA(img1); // OK, adding "restrict" is allowed } 来解决这个问题。 但是后来我无法将其他结构传递给该函数,因为它会导致语法错误。 所以我可以得出结论:

对于layout(rgba32f),您必须拥有包含布局限定符的图像, 但声明这个函数参数是破坏/错误定义的。 解析器错误非常可能,因为内置类型有效,这表明对这些类型的解析器支持更强大。

0 个答案:

没有答案