Что является обязательной точкой в ​​OpenGL/OpenGL ES?

Я изучаю OpenGL/ES. Мне не ясно, что такое обязательный пункт. Я просмотрел документы OpenGL, а также искал в Интернете, но не смог найти что-то, что хорошо объясняет обязательную точку.

Вот пример того, что я подразумеваю под точкой привязки.

void glUniformBlockBinding (программа GLuint, GLuintiformBlockIndex, GLuintiformBlockBinding);

Буду признателен, если вы сможете объяснить, что такое обязательный пункт, как он используется и т. Д.

Спасибо.

1 ответ

Точки связывания единообразных блоков действуют точно так же, как текстурные блоки.

В вашем шейдере вы ссылаетесь на образец текстуры (например, sampler2D), и вы связываете этот сэмплер с текстурным блоком, вызывая glUniform1i(samplerUniformIndex, textureUnitNumber);, Перед рисованием с помощью шейдера, вы привязываете текстуру к этому textureUnitNumber используя комбинацию glActiveTexture (установить активную текстурную единицу), и glBindTexture привязать текстуру к активному текстурному блоку. Итак, здесь есть три понятия:

  1. Точка привязки (блок текстуры)
  2. Ресурс, который будет использоваться (текстура)
  3. Вещь, использующая ресурс (сэмплерная форма в вашем шейдере)

Точки привязки для одинаковых блоков одинаковы. У тебя есть:

  1. Равномерная привязка блока
  2. Ресурс, который будет использоваться. В этом случае это буферный объект, в котором хранятся данные унифицированного блока.
  3. Вещи, использующие ресурс, который является единым блоком в вашем шейдере.

Мы можем сравнить, как используются текстуры и объекты единого буфера.

Связывание точки привязки с вещью с использованием ресурса:

текстуры:

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 привязать определенный диапазон единого буфера.

Другие вопросы по тегам