В настоящее время я создаю класс текстур для проекта, над которым я работаю, и пытаюсь с самого начала хорошо создавать вещи, чтобы предотвратить будущие головные боли.
В настоящее время я могу загрузить информацию о текстуре в графический процессор следующим образом:
void Texture::load_to_GPU(GLuint program)
{
if(program == Rendering_Handler->shading_programs[1].programID)
exit(EXIT_FAILURE);
glUseProgram(program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
GLint loc = glGetUniformLocation(program, "text");
if(loc == GL_INVALID_VALUE || loc==GL_INVALID_OPERATION)
{
cerr << "Error returned when trying to find texture uniform."
<< "\nuniform: text"
<< "Error num: " << loc
<< endl;
return;
}
glUniform1i(loc,0);
}
Однако я хотел бы иметь возможность динамически определять единицу текстуры.
Например, вместо жесткого кодирования унифицированного имени «текст», я хотел бы передать строку в качестве аргумента и сделать что-то похожее на glGetUniformLocation()
, но для текстурных единиц.
Другими словами, я хочу выбрать текстурную единицу, к которой должна динамически привязываться текстура, а не жестко ее кодировать.
Для этого мне нужно найти текстурный блок, который в данный момент не используется, в идеале от наименьшего до самого большого текстурного блока.
Какой набор функций OpenGL я мог бы использовать для достижения этого поведения?
EDIT:
Важный инструмент, который мне нужен для достижения желаемого поведения, которое, как мне кажется, неясно из исходного поста:
Как только единица текстуры будет привязана к униформе сэмплера, я бы хотел иметь возможность связать единицу текстуры с униформой.
Так что, если текстурный блок 5 привязан к единой "sampler2d texture_5"
Мне нужна функция, которая принимает унифицированную метку и возвращает единицу текстуры, привязанную к этой метке.