Воскресенье, 2024-05-19
Сборник компьютерных технологий
Меню сайта
Категории раздела
My articles [30]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » My articles

GLSL Pseudo-Instancing

Немного о технологии

Технология GLSL Pseudo-Instancing была разработана компанией NVidia в ноябре 2004 года. Однако в OpenGL 3.1 появилось расширение glDrawElementsInstancedEXT, выполняющее тот же инстансинг, но на аппаратном уровне, что является более быстрым. Однако здесь стоит отметить, что доступна новая версия графической библиотеки только для обладатлей видеокарт класса GeForce 8XXX. Поэтому в наше время, когда некоторые люди всё ещё надеются что-то получить от GeForce 6600, поддержка таких пользователей желательна. 
 
И так же есть ещё один важный момент. GLSL Pseudo-Instancing будет работать на всех видеокартах, поддерживающих GLSL. А вот поддержку glDrawElementsInstancedEXT никто гарантировать не может. Ведь расширение EXT, а следовательно любой производитель может не вводить расширение. Это ещё один плюс к выбору GLSL Pseudo-Instancing.

 

Немного о статье

Эта статья и соответствующий SDK пример демонстрируют технику ускорения рендеринга копий (экземпляров, instances) геометрии посредством шейдерного языка GLSL. Этот метод опирается на эффективность поточных данных из постоянных свойств вершины в  OpenGL. Преобразования мировой системы координат (и, возможно, другие конкретные данные каждой копии) передаются каждый раз, используя текстурные координаты вместо унифицированных (uniform) переменных.
 
 

Введение

Визуализация большого количества копий геометрии, полезна для создания объектов, таких как скалы, кустарники, деревья, ящики и мусор. В жанрах некоторых игр, они также могут помочь при визуализации оружия и доспехов.

К сожалению, рендинг значительного числа объектов приводит к слишком большой нагрузке. Это особенно проявляется в GLSL, где драйвер должен установить соответствие между абстрактными uniform-переменными и реальными физическими регистрами процессора. С аппаратной точки зрения, большое количество постоянных обновлений тоже не улучшают ситуацию.  
OpenGL имеет понятие вершинный атрибут, который могут быть передан через команду незамедлительного выполнения (immediate mode) glTexCoord(). Эти вызовы API являются весьма эффективными на стороне драйвера, они не требуют подтверждения или потенциально сложное обратное преобразование данных (remapping). Они также очень эффективны на аппаратной стороне, ведь не нагружают вершинную часть конвейера.
Эффективность постоянных вершинных атрибутов может быть использована при передаче экземпляра данных, таких, как преобразование, цвет и другие данные через OpenGL в немедленном режиме вычислений. Польза от этого метода может быть достаточна велика (особенно в указанных случаях с небольшим числом вершин на медленных процессорах).

 

Технология

Если вы рендерите большинство объектов в GLSL, вы можете использовать модельно видовую (modelview) матрицу стека и так же использовать gl_ModelViewProjectionMatrix в вершинных шейдерах. Эффективность такого подхода, к сожалению, не велика из-за дополнительной нагрузки на CPU, участвующего в вычислении матрицы преобразования и загрузки её на GPU (в большинстве игр производительность сильно зависит от процессора, поэтому, как правило, это является хорошей идеей для разгрузки центрального процессора).

 

Альтернативный подход будет передавать видовую матрицу для копий. Мировая матрица может быть передана для каждой копии, используя glUniform4fvARB (), glUniformMatrix4fvARB () или аналогичные команды. Этот метод требует больше вычислений потому, что каждая вершина должна быть преобразована в три матрицы (при освещении в границах экрана) вместо одной. Однако эта трансформация сгружает дополнительные расчеты с чрезмерно нагруженного процессора на GPU. Это один из методов, используемых в примере.

 

В псевдо-экземплярах решение принимает аналогичный, но несколько иной подход. Подобно выше описанной технологии, видовые преобразования передаются для всех экземпляров. В отличие от вышеуказанной техники, мировые матрицы передаются с помощью glMultiTexCoord (), вместо вызовов glUniform4fvARB () (или аналогичных команд). Так мы получаем аппаратные преимущества из постоянных вершинных атрибутов. Пример кода ниже демонстрирует эту технику. Для получения дополнительной подробной информации см. glsl_pseudo_instancing в SDK примере.
// Render the instances of the mesh
for(i=0; i{
// Send down the matrix and other parameters
if(gUseInstancing)
{
// pseudo-instancing passes per-instance data down
// as texture coordinates
glMultiTexCoord4fv(GL_TEXTURE1, instances[i].mWorld[0]);
glMultiTexCoord4fv(GL_TEXTURE2, instances[i].mWorld[1]);
glMultiTexCoord4fv(GL_TEXTURE3, instances[i].mWorld[2]);
}
else
{
// Traditional GLSL uniform variable downloading
glUniform4fvARB(WorldMatrixLocation, 3,
(float*)(instances[i].mWorld));
}
// Set the color for the instance
glColor4fv(gInstances[i].mColor);
// Render the instance
mesh->render();
}
Техника псевдо-экземпляров существует и в Direct3D (поддерживаются Shader Model 3.0 GPU). Основным отличием является то, что в Direct3D instance API уменьшает количество DrawIndexedPrimitive (), вызывая from many to one. Этот 
DrawIndexedPrimitive () доводит до большого выигрыша в производительности у Direct3D. В OpenGL приложение вызывает команду glDrawElements () (или похожие команды) для каждого экземпляра. Подход псевдо-инстансинга прибавляет не слишком много производительности, поскольку glDrawElements () является очень эффективной в OpenGL.

Псевдо-инстансинг относится к геометрии с небольшим числом атрибутов каждого экземпляра. Техника плохо масштабируется при сложной сетке, такой как при skinning, там не хватает вершинных атрибутов, чтобы сохранить все преобразования костей для каждого экземпляра. Методика псевдо-инстансинга не предназначена для замены традиционной системы визуализации частиц или 
замены статической сетки, где геометрия может быть разумно запечённой в мировое пространство.
Заключение
Техника псевдо-экземпляров - это простой способ повысить производительность при большом количестве геометрии. Преимущество в производительности особенно велико, когда экземпляры геометрии имеют мало вершин и когда псевдо-инстансинг используется на машинах с медленным процессором. Метод работает на всех графических процессорах NVIDIA, которые поддерживают GLSL вершинные шейдеры (аппаратное ускорение на GeForce 3 и выше); Техника не требует Shader Model 3.0.
 
SDK пример
SDK пример можете скачать здесь: http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html
Категория: My articles | Добавил: DungeonLords (2009-08-12)
Просмотров: 8062 | Комментарии: 1
Всего комментариев: 1
1 DungeonLords  
1
[редактирование: Alegorium (PeyTy)]

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright Forcer, Inc © 2024
    Бесплатный конструктор сайтов - uCoz