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,但如何自动执行此操作。
如果我创建着色器,我会使用折射来获取变量名称及其位置。
- 如何获取绑定 ID?
- 如何从布局 (r32f) 获取纹理格式以自动在我的代码中设置它?
If I create shader I use refraction to get variable names and its locations.
我认为你指的是反射而不是折射,假设你指的是编程语言概念。
现在,有趣的是 image2D
和 sampler2D
是 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 位图像。
我有 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,但如何自动执行此操作。
如果我创建着色器,我会使用折射来获取变量名称及其位置。
- 如何获取绑定 ID?
- 如何从布局 (r32f) 获取纹理格式以自动在我的代码中设置它?
If I create shader I use refraction to get variable names and its locations.
我认为你指的是反射而不是折射,假设你指的是编程语言概念。
现在,有趣的是 image2D
和 sampler2D
是 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 位图像。