Как OpenGL узнает, какой блок изображения прикрепить к униформе? - PullRequest
0 голосов
/ 19 мая 2018

При загрузке текстур в текстурные блоки мне обычно приходится находить расположение текстурного блока и загружать блок в unform, что выглядит примерно так:

glActiveTexture(GL_TEXTURE0 + texture_unit);
glBindTexture(target, textureID);
//Get the uniform location in the program and attach the texture unit
GLuint location = program->get_uniform_location(uniform);
glUniform1i(location,texture_unit);

Однако у меня есть программа, котораяиспользует image3D, и единственная строка, которую я вызываю, чтобы связать текстуру с изображением:

glBindImageTexture(image_unit, textureID, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA8);

А затем в шейдере я сэмплирую его как:

uniform layout(rgba8) image3D image;

vec3 c = vec3(imageLoad(image, ivec3(v_uv,0)));

.Ожидаемые значения, независимо от того, какие изменения я делаю, поэтому, кажется, работает просто отлично.Это подводит меня к моему вопросу, как OpenGL может определить, что униформа uniform layout(rgba8) image3D image; должна быть присоединена к блоку изображений с помощью:

glBindImageTexture(image_unit, textureID, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA8);

Что бы произошло, если бы у меня было несколько изображений?

1 Ответ

0 голосов
/ 19 мая 2018

Единица изображения, назначенная для image в вашем шейдере, равна 0, поскольку это значение по умолчанию для любой униформы, значение которой вы не предоставляете.И ты не сделал.В вашем случае 0, вероятно, является значением вашей переменной image_unit.Так что все работает.

Лучше сделать это правильно, назначив привязку к переменной изображения .Если вы используете современный OpenGL, вы можете поместить это в шейдер с помощью квалификатора макета binding .В противном случае вы должны делать то же самое, что и для текстур (что, кстати, вы можете также назначать в шейдерах с квалификатором binding): изменить значение униформы с помощью glUniform1i.

...