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

时间:2014-12-10 19:53:10

标签: c++ opengl-es opengl-es-3.0

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

1 个答案:

答案 0 :(得分:1)

图像单位是图像均匀变量的值。虽然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);