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

Методы оптимизации под OPENGL
5
mesh1.draw();
mesh3.draw();
text2.bind();
mesh2.draw();
Оптимизации рисования моделей.
Использование фиксирован-
ного конвейера (fixed pipeline) может серьезно сказаться на произво-
дительности, поскольку фиксированный конвейер содержит в себе
реализацию возможностей, которые часто бывают просто не нужны
(например, свет, туман и др.). В этом случае лучше подходит про-
граммируемый конвейер (programmable pipeline) с использованием
шейдеров, которые обеспечивают гибкую реализацию всего необхо-
димого без ущерба для производительности
[1]. Также фиксирован-
ный конвейер в новых версиях OpenGL объявлен как deprecated. В
общем случае при инициализации приложения достаточно загрузить
и привязать шейдер. Все последующие команды рисования будут пе-
редавать данные именно ему. Приведем пример, демонстрирующий
загрузку и использование шейдеров:
// функция проверки состояния шейдера или линковки
void checkStatus(bool isLinking = false)(uint id,
string name) {
int status;
// сообщение компиляции
char str[4096];
// получение статуса шейдера
static if(isLinking)
GetProgramiv(id, LINK_STATUS, &status);
else
GetShaderiv(id, COMPILE_STATUS, &status);
// получение информационного сообщения
static if(isLinking)
GetProgramInfoLog(id, str.sizeof, null, str.ptr);
else
GetShaderInfoLog(id, str.sizeof, null, str.ptr);
auto s = str.ptr.to!string;
if(status) { // в случае успеха статус != 0
if(s.length)
writeLog(`%s: %s`, name, s);
return;
}
enum act = isLinking ? `linking` : `compiling`;
// в случае неуспеха — генерация исключения
throwError("%s %s failed: %s\n", act, name, s);
}
1,2,3,4 6,7,8,9,10,11
Powered by FlippingBook