Как сохранить текстурные униформы в состоянии программы?

Я уже узнал, что юниформ-значения хранятся в состоянии шейдерной программы.

// GLSL code
uniform mat4 projection;

// C++ code
GLuint location = glGetUniformLocation(program, "projection");
glUniformMatrix4fv(location, 1, GL_FALSE, pointer);

Но, похоже, это не относится к униформам текстур, поскольку они привязаны к номеру слота текстуры, а не к их идентификатору.

// GLSL code
uniform sampler2D albedo;

// C++ code
int slot = 3;
glActiveTexture(GL_TEXTURE0 + slot);
glBindTexture(GL_TEXTURE_2D, id);
GLuint location = glGetUniformLocation(program, "albedo");
glUniform1i(location, slot);

Есть ли способ привязать идентификатор текстуры к форме sampler2D шейдера? Таким образом, мне не пришлось бы привязывать все текстуры вручную для каждого прохода.


person danijar    schedule 04.03.2013    source источник


Ответы (1)


Есть ли способ привязать идентификатор текстуры к форме Sampler2D шейдера?

Нет, не совсем, потому что сэмплеры обращаются к блокам текстур, а не к объектам текстур. Однако графические процессоры NVidia Kepler могут использовать текстуры без привязки, доступные для OpenGL в качестве расширения для конкретного поставщика, которые практически реализуют то, что вы просите.

person datenwolf    schedule 04.03.2013
comment
Спасибо за Ваш ответ. Могу ли я упростить процесс, используя хотя бы layout(location = 3)? - person danijar; 04.03.2013
comment
Что ж, если все, чего вы хотите, это написать glUniform1i(3, texture_unit_to_use);, тогда да. - person datenwolf; 04.03.2013
comment
Ок, я понял, что это другое дело. - person danijar; 04.03.2013
comment
@sharethis: Могу ли я упростить процесс хотя бы с помощью layout(location = 3)? Если у вас есть реализация GL 4.2 или аппаратное обеспечение, поддерживающее shading_language_420pack, да. Только это binding, а не location. - person Nicol Bolas; 05.03.2013