Как получить точку привязки переменной изображения в OpenGLES

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

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);
1

Другие решения


По вопросам рекламы [email protected]