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

Методы оптимизации под OPENGL
7
CompileShader(vs);
// проверка статуса вертексного шейдера
checkStatus(vs, `vertex shader`);
// теперь то же самое, но с фрагментным шейдером
ShaderSource(fs, 1, fs.ptr, null);
CompileShader(fs);
checkStatus(fs, `fragment shader`);
// привязываем шейдеры к шейдерной программе
gl AttachShader(prog, vs);
gl AttachShader(prog, fs);
// линковка программы
gl LinkProgram(prog);
// проверка линковки
checkStatus!true(prog, `shader program`);
// привязка шейдера к контексту
UseProgram(prog);
Теперь при рисовании достаточно установить матрицы объектов:
auto loc = GetUniformLocation(“vs_Model”);
UniformMatrix4fv(loc, 1, FALSE, matrix.ptr);
Многие объекты на сцене достаточно удалены от камеры, поэтому
имеют малые размеры. Использовать высокодетализированные тексту-
ры вместе с ними не имеет смысла, так как может быть видно всего
лишь несколько пикселов из всей текстуры, а это ведет к увеличению
кэш-промахов и падению производительности. В OpenGL присутствует
техника под названием мипмаппинг (mipmapping), суть которой состоит
в том, что для исходной текстуры создаются уменьшенные копии, каж-
дая из которой в 4 раза меньше предыдущей. Копии создаются до тех
пор, пока не получится текстура размером в 1
1 пиксел. Во время рен-
деринга определяется расстояние до объекта, в зависимости от которого
выбирается подходящая текстура (мип-уровень). Это позволяет не ис-
пользовать высокую детализацию там, где в этом нет смысла, а значит,
повысить производительность. Недостатком подхода является увеличе-
ние расходов памяти на 1/3. Но для современных видеокарт с их объе-
мами памяти это не должно быть проблемой. Сгенерировать мип-
уровни можно следующим способом:
BindTexture(TEXTURE_2D, tid); // привязываем текстуру
// заставляем OpenGL сгенерировать мип-уровни
GenerateMipmap(TEXTURE_2D);
Стоит учесть, что качество мип-уровней, сгенерированных драйве-
ром OpenGL, не всегда может быть лучше. В этом случае можно само-
стоятельно загружать собственные изображения по мип-уровням.
1,2,3,4,5,6 8,9,10,11
Powered by FlippingBook