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

И.В. Дикан, Ю.С. Белов
4
Часто бывает нужно изменить какой-либо параметр у шейдера,
текстуры или другого объекта OpenGL (иногда без изменения внут-
реннего состояния конвейера). Для этого придется получать текущий
идентификатор, привязывать новый, выполнять какие-либо действия,
потом привязывать старый. Все это увеличивает накладные расходы,
что отрицательно сказывается на производительности. Поэтому
необходимо использовать расширение EXT_direct_state_access, кото-
рое предоставляет bindless интерфейс для изменения объектов. Это
расширение уменьшает накладные расходы и упрощает код, предо-
ставляет функции для работы со всеми объектами OpenGL, его ис-
пользование всегда желательно. Например, чтобы изменить значение
uniform-переменной потребуется сделать следующее:
uint oldSid;
GetIntegerv(CURRENT_PROGRAM, &oldSid);
UseProgram(sid);
Uniform1f(loc, value);
UseProgram(oldSid);
а благодаря DSA:
ProgramUniform1f(sid, loc, value);
Желательно избегать использования функций многих аргумен-
тов, так как это может накладывать дополнительные накладные рас-
ходы. Например, для передачи vec4 в шейдер лучше применять
Uniform4fv вместо Uniform4f, если, конечно, координаты вектора
хранятся в пользовательских типах последовательно, что позволяет
просто получить указатель на них.
Изменение состояния конвейера — операция не из «дешевых».
Например, если необходимо применить одну текстуру к двум разным
моделям, то лучше эти модели рисовать последовательно, чтобы бы-
ло как можно меньше команд привязки (BindTexture). Это же отно-
сится и к остальным объектам OpenGL: шейдерам, сэмплерам, VBO,
VAO и др.
Неправильно:
text1.bind();
mesh1.draw();
text2.bind();
mesh2.draw();
text1.bind();
mesh3.draw();
Правильно:
text1.bind();
1,2,3 5,6,7,8,9,10,11
Powered by FlippingBook