我有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,但如何自动执行此操作。
如果我创建着色器,我会使用折射来获取变量名称及其位置。
答案 0 :(得分:2)
如果我创建着色器,我会使用折射来获取变量名称及其位置。
我认为你的意思是反思而不是折射,假设你的意思是编程语言概念。
现在,有趣的是image2D
和sampler2D
是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位图像。