УДК 004.925 Методы оптимизации под OPENGL © И.В. Дикан, Ю.С. Белов КФ МГТУ им. <...> Н.Э. Баумана, Калуга, 248000, Россия Рассмотрены основные методы оптимизации графических приложений, написанных с использованием OpenGL. <...> Описаны методы низкоуровневой оптимизации, в том числе использующие различные расширения OpenGL. <...> Изложены методы изменения формата графических объектов для повышения производительности конечных приложений. <...> Оптимизация рендеринга является важным этапом разработки конечного приложения, поскольку позволяет увеличить число кадров в секунду, снизить требования к аппаратному обеспечению в приложениях реального времени, а для рендеров — уменьшить время, затрачиваемое на отрисовку конечной сцены. <...> Рассмотрим основные методы оптимизации приложений: низкоуровневые, рисования моделей и оптимизации моделей. <...> К тому же в новых версиях OpenGL эти функции объявлены как deprecated. <...> От них следует отказаться в пользу новых расширений типа ARB_vertex_buffer_object (VBO), позволяющих хранить вертексы в одном буфере в памяти GPU. <...> Следующий пример демонстрирует разницу старого и нового подходов: struct Vertex { float x, y, z; } 1 И.В. Дикан, Ю.С. Белов void drawOldWay(ref const Vertex[] vertices) { // старый стиль отрисовки Begin(GL_TRIANGLES); foreach(v; vertices) // все вертексы каждый раз передаются // из оперативной памяти в память GPU Vertex3f(v.x, v.y, v.z); End(); } uint createVBO(ref const Vertex[] vertices) {// функция создания VBO uint id; // создаётся буфер GenBuffers(1, &id); // привязывается к текущему контексту BindBuffer(GL_ARRAY_BUFFER, id); // данные загружаются в быструю память GPU BufferData(GL_ARRAY_BUFFER, Vertex.sizeof * vertices.length, vertices.ptr, GL_STATIC_DRAW); return id; } void bindVBO(uint id) { // включается нулевой атрибут, // по которому обычно располагаются координаты EnableVertexAttribArray(0); BindBuffer(GL_ARRAY_BUFFER, id); // OpenGL уведомляется о содержимом буфера VertexAttribPointer( 0, 3, // номер атрибута (обычно это 0) // количество элементов GL_FLOAT, // тип элементов GL_FALSE, // элементы не нуждаются в нормализации 0, // все элементы идут друг за другом null // базовое смещение отсутствует ); } void unbindVBO() { DisableVertexAttribArray(0 <...>