Методы оптимизации под OPENGL - page 3

Методы оптимизации под OPENGL
3
уменьшить накладные расходы. Приведенный ниже пример демон-
стрирует это:
uint createVAO(uint vboId) {
uint id;
GenVertexArrays(1, &id);
// с этого момента OpenGL будет «записывать» всю
// последовательность изменений конвейера
BindVertexArray(id);
bindVBO(vboId); // привязка VBO
BindVertexArray(0); // окончание «записи»
unbindVBO();
return id;
}
void drawVAO(uint id, uint count) { // VAO дает воз-
можность использовать
// всего три команды
BindVertexArray(id);
DrawArrays(GL_TRIANGLES, 0, count);
BindVertexArray(0); // отвязка VAO
}
Текстуры в OpenGL состоят из изображения, мип-уровней (mip-
level) и параметров обработки самой текстуры (режимы фильтрации,
отсечения текстурных координат и др.). Изменение параметров обра-
ботки может быть затратным. Возникают ситуации, когда набор та-
ких параметров одинаков для множества текстур и задание их для
каждой текстуры может быть неэффективным. В этом случае необ-
ходимо использовать расширение ARB_sampler_objects, поддержи-
вающее сэмплеры (sampler object), которые позволяют хранить пара-
метры отдельно от текстуры, т. е. при создании текстуры ей не требу-
ется вновь указывать различные параметры. Сэмплеры привязаны к
текстурным блокам (texture unit), поэтому один сэмплер можно ис-
пользовать с несколькими текстурами.
Приведем пример. Вариант выполнения с каждой текстурой:
BindTexture(TEXTURE_2D, tid);
TexParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, LINEAR);
Способ, когда достаточно установить значение сэмплера один
раз:
SamplerParameteri(sid, TEXTURE_MAG_FILTER, LINEAR);
Теперь можно легко привязать сэмплер к текстурному блоку, и
он будет использоваться для каждой текстуры:
BindSampler(texUnitNum, sid);
1,2 4,5,6,7,8,9,10,11
Powered by FlippingBook