如何在 OpenGLES 中获取图像变量的绑定点

How to get a binding point of an image variable in OpenGLES

本文关键字:变量 绑定 图像 获取 OpenGLES      更新时间:2023-10-16

我正在尝试在我的 GLES 着色器中获取图像变量的绑定点。我可以使用该代码为制服或着色器存储块执行此操作:

GLenum Prop = GL_BUFFER_BINDING;
GLint Binding = -1;
GLint ValuesWritten = 0;
glGetProgramResourceiv( GLProgram, GL_UNIFORM_BLOCK, i, 1, &Prop, 1, &ValuesWritten, &Binding );

不幸的是,没有GL_IMAGE_BINDING这样的东西.在桌面GL中,我只是使用GetUniformLocation获取图像制服的位置,然后使用glProgramUniform1i将其绑定到图像插槽。不幸的是,在OpenGLES中,glProgramUniform1i只能用于采样器制服,不适用于图像制服。我需要这个绑定点的原因是因为我正在执行自动资源绑定。我的资源可以与统一变量名称相关联。我希望它们自动分配到正确的图像插槽。到目前为止,除了 GLES 上的图像之外,这适用于所有资源。

图像单位是图像均匀变量的值。虽然 ES 3.1 规范不允许使用 glProgramUniform1i() 为这些变量设置值,但我看不到任何内容可以阻止您使用 binding=... 布局限定符获取在 GLSL 代码中设置的值。

这是基于规范的第 7.10 节"图像"。在第112页,它说:

图像制服的值是一个整数,用于指定访问的图像单位。

在第 113 页的同一部分中:

图像变量的位置是使用 GetUniformLocation 查询的,就像任何统一变量一样。

因此,要在程序 prog 中获取变量"MyImage"的图像单元:

GLint loc = glGetUniformLocation(prog, "MyImage");
GLint imgUnit = -1;
glGetUniformiv(prog, loc, &imgUnit);

这为您提供了着色器中的图像变量绑定到的图像单元。如果需要映像名称,可以继续查询:

GLint imgName = -1;
glGetIntegeri_v(GL_IMAGE_BINDING_NAME, imgUnit, &imgName);