OpenGL - 布局信息

OpenGL - layout informations

我有 GLSL 计算着色器。很简单的一个。我指定输入纹理和输出图像,映射到纹理。

layout (binding=2) uniform sampler2D srcTex;

layout (binding=5, r32f) writeonly uniform image2D destTex;

在我的代码中,我需要调用 glBindImageTexture 将纹理附加到图像。现在,这个函数的第一个参数是

unit
    Specifies the index of the image unit to which to bind the texture 

我知道,我可以通过代码手动将此值设置为 5,但如何自动执行此操作。

如果我创建着色器,我会使用折射来获取变量名称及其位置。

If I create shader I use refraction to get variable names and its locations.

我认为你指的是反射而不是折射,假设你指的是编程语言概念。

现在,有趣的是 image2Dsampler2D 是 GLSL 中的 opaque 类型(图像单元的句柄) .通常,您可以使用现代 glGetProgramResource* (...) API(GL_ARB_program_interface_query 或 4.3 中的核心)在 GLSL 着色器中查询有关制服、缓冲区等的真正详细信息。但是,不透明类型不被 GLSL 视为程序资源,并且与该功能不兼容 - 您想要的信息与图像单元相关,即统一引用,而不是统一本身。

How can I get binding ID?

这很简单。

您可以调用 glGetUniformiv (...) 来获取分配给您的 image2D 的值。在 GL 方面,不透明制服的工作方式与任何其他制服(用于分配和查询值)没有什么不同,但在 GLSL 中,您不能使用 = 运算符将值分配给不透明数据类型。这就是创建 layout (binding = ...) 语义的原因,它们允许您在着色器本身中分配绑定,而不必调用 API 函数,并且 完全可选 .

How can I get texture format from layout (r32f) to set it in my code automatically?

这目前是不可能的,将来可能与负载无关(它已经与商店无关)。从技术上讲,您在这里不需要完全匹配。只要图片格式大小/class匹配,就可以加载图片没问题。

事实上,你必须在 GLSL 中声明格式的唯一原因是 imageLoad (...) 的 return 格式在编译时是已知的(这使得它与 writeonly 合格的图像)。现在有一个 EXT 扩展 (GL_EXT_shader_image_load_formatted),它完全消除了为非只写图像建立图像格式的需要。

即使对于非只写图像,由于只需要匹配大小 / class,我认为您真的不需要这个。 r32f 的图像 class 为 1x32,大小为 32,但它是浮点数这一事实与任何事情都无关。因此,您可能真正考虑的是用图像 class 来命名您的制服 - 将这种制服称为 destTex_1x32 ,很明显它是一个 1 分量的 32 位图像。