Как да получите точка на свързване на променлива на изображение в 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. В desktop GL аз просто получавам местоположението на униформата на изображението с помощта на GetUniformLocation и след това го свързвам към слот за изображение с помощта на glProgramUniform1i. За съжаление в OpenGLES glProgramUniform1i може да се използва само за униформи за вземане на проби и не работи за униформи с изображения. Причината, поради която имам нужда от тази точка на свързване, е, че правя автоматично свързване на ресурси. Моите ресурси могат да бъдат свързани с еднообразно име на променлива. Искам те автоматично да бъдат присвоени на десния слот за изображение. Това работи добре досега за всички ресурси, с изключение на изображенията на GLES.


person Egor    schedule 10.12.2014    source източник


Отговори (1)


Единицата за изображение е стойността на променливата за унифициране на изображението. Въпреки че спецификацията на 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);
person Reto Koradi    schedule 15.12.2014
comment
Благодаря, точно това ми трябва. Работех с DX от години и бях нов в OpenGL, така че някои неща ме объркват много. Заявката за единица за обвързване на изображение се оказа много различна от получаването на унифицирано обвързване на буфера и ми изглежда малко като задна врата. - person Egor; 16.12.2014
comment
Изображенията са много по-сходни с текстурите/семплерите. Основната разлика е, че можете да задавате свързвания на текстура/семплер с glUniform1i(), но не и свързвания на изображения. Всъщност имаше версия на спецификацията, която казваше, че можете, но беше редактирана (все още там, но със зачертано). Историята на ревизиите препраща към грешка на Khronos, която не можах да намеря в публичната база данни за грешки. Бих искал да видя защо са го премахнали. Може би просто са го сметнали за излишно, след като можете да посочите обвързването в кода на шейдъра. - person Reto Koradi; 16.12.2014