Я пытаюсь получить точку привязки переменной изображения в моем шейдере 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()
Я ничего не вижу, что мешает тебе получение значение, которое было установлено в коде 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);