Что является обязательной точкой в OpenGL/OpenGL ES?
Я изучаю OpenGL/ES. Мне не ясно, что такое обязательный пункт. Я просмотрел документы OpenGL, а также искал в Интернете, но не смог найти что-то, что хорошо объясняет обязательную точку.
Вот пример того, что я подразумеваю под точкой привязки.
void glUniformBlockBinding (программа GLuint, GLuintiformBlockIndex, GLuintiformBlockBinding);
Буду признателен, если вы сможете объяснить, что такое обязательный пункт, как он используется и т. Д.
Спасибо.
1 ответ
Точки связывания единообразных блоков действуют точно так же, как текстурные блоки.
В вашем шейдере вы ссылаетесь на образец текстуры (например, sampler2D
), и вы связываете этот сэмплер с текстурным блоком, вызывая glUniform1i(samplerUniformIndex, textureUnitNumber);
, Перед рисованием с помощью шейдера, вы привязываете текстуру к этому textureUnitNumber
используя комбинацию glActiveTexture
(установить активную текстурную единицу), и glBindTexture
привязать текстуру к активному текстурному блоку. Итак, здесь есть три понятия:
- Точка привязки (блок текстуры)
- Ресурс, который будет использоваться (текстура)
- Вещь, использующая ресурс (сэмплерная форма в вашем шейдере)
Точки привязки для одинаковых блоков одинаковы. У тебя есть:
- Равномерная привязка блока
- Ресурс, который будет использоваться. В этом случае это буферный объект, в котором хранятся данные унифицированного блока.
- Вещи, использующие ресурс, который является единым блоком в вашем шейдере.
Мы можем сравнить, как используются текстуры и объекты единого буфера.
Связывание точки привязки с вещью с использованием ресурса:
текстуры:
GLuint samplerUniformIndex;
glUseProgram(program);
samplerUniformIndex = glGetUniformLocation(program, "mysampler");
glUniform1i(samplerUniformIndex, textureUnitNumber);
Унифицированные буферы:
GLuint uniformBlockIndex = glGetUniformBlockIndex(program, "myblock");
glUniformBlockIndex(program, uniformBlockIndex, uniformBlockBinding);
Связывание ресурса с его точкой привязки:
текстуры:
glActiveTexture(textureUnitNumber);
glBindTexture(textureTarget, texture);
Унифицированные буферы:
glBindBufferBase(GL_UNIFORM_BUFFER, uniformBlockBinding, uniformBuffer);
Или вы можете использовать glBindBufferRange
привязать определенный диапазон единого буфера.