OpenGL - 布局信息

时间:2015-01-16 12:25:29

标签: opengl

我有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)获取纹理格式以自动在我的代码中设置它?

1 个答案:

答案 0 :(得分:2)

  

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

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

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

  

我如何获得绑定ID?

这是相当直接的。

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

  

如何从布局(r32f)获取纹理格式以自动在我的代码中设置它?

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

实际上,您必须在GLSL中声明格式的唯一原因是,imageLoad (...)的返回格式在编译时是已知的(这使得它与writeonly合格图像无关)。现在有一个EXT扩展(GL_EXT_shader_image_load_formatted),完全不需要为非写入图像建立图像格式。

即使对于非写作图像,由于只需要匹配大小/类,我认为你真的不需要这个。 r32f的图像类为1x32,大小为 32 ,但它是浮点的事实与任何事情无关。因此,您可能真正考虑的是通过图像类命名您的制服 - 将此类统一称为destTex_1x32,并且很明显它是一个单组件的32位图像。