opengl共享内存布局和大小

vwoqyblh  于 2022-12-12  发布在  其他
关注(0)|答案(1)|浏览(199)

给定以下glsl声明(这只是一个示例):

struct S{
    f16vec3 a;
    float16_t b;
    f16vec3_t c;
    float16_t d;
};
shared float16_t my_float_array[100];
shared S my_S_array[100];

我有以下问题:

  • 例如,在上面的例子中,给定的声明将使用多少共享内存?
  • 共享内存中的变量使用哪种内存布局?std 140、std 430还是其他?
  • 这对银行冲突有何影响?

我能够使用 glGetProgramBinary 获得程序所需的总共享内存,并跳过直到文本部分的开头(由以“!!NV”开头的行指示):

...
!!NVcp5.0
OPTION NV_shader_buffer_load;
OPTION NV_internal;
OPTION NV_gpu_program_fp64;
OPTION NV_shader_storage_buffer;
OPTION NV_bindless_texture;
OPTION NV_gpu_program5_mem_extended;
GROUP_SIZE 4 4 4;
SHARED_MEMORY 4480;
SHARED shared_mem[] = { program.sharedmem };
...

这是相当间接的,虽然并没有告诉很多关于对齐/ Package 规则。

yrefmtwq

yrefmtwq1#

共享内存中的变量使用哪种内存布局?std140、std430还是其他?
它是由实现定义的。
应用于缓冲区支持存储的布局很重要,因为着色器外部的代码需要能够访问它。shared变量不能在着色器外部,因此此类变量的布局在功能上是由实现定义的。
简而言之,你无法确切地知道任何一个shared变量声明会占用多少存储空间,你可以假设它会占用 * 至少 * 与存储你要求存储的数据所需的最小字节数一样多的字节,但仅此而已。
这对银行冲突有何影响?
“库”不是OpenGL或GLSL所能识别的概念,因此它是由实现定义的。

相关问题