2

我试图在我的 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 上的图像之外,所有资源都可以正常工作。

4

1 回答 1

2

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

这基于规范的第 7.10 节“图像”。在第 112 页上,它说:

图像统一的值是指定访问的图像单元的整数。

并在第 113 页的同一部分中:

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

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

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

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

GLint imgName = -1;
glGetIntegeri_v(GL_IMAGE_BINDING_NAME, imgUnit, &imgName);
于 2014-12-15T01:06:30.163 回答