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

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

О визуализации копий объектов посредством расширений
GL_ARB_draw_instanced
используется на стром железе. Его хорошо описал Боресков вот здесь: http://www.steps3d.narod.ru/tutorials/draw-instanced-tutorial.html . Хотя практическая часть у него хромает, поэтому я приведу куски кода из своего примера.

Итак. Вы не должны использовать GLBegin/GLEnd, для получения максимально возможного fps мы будем использовать VBO. Рассмотрим вначале как бы мы отрисовали плоскость через VBO. Я предполагаю, что вы уже активировали Compatibility контекст OpenGL т.к. мы будем использовать функционал, соответствующий версиям 1.5 - 2.1.
Код Delphi:
var vertexBuffer:array[0..1] of GLInt;
GLSLHandle:TGLProgramHandle;
procedure TForm1.VBOCreate(Sender: TObject);
var
Vertexes:array of array[0..1] of GLFloat;
TexCoords:array of array[0..1] of GLFloat;
begin
setlength(Vertexes,4*2);
Vertexes[0][0]:=1; Vertexes[0][1]:=-1;
Vertexes[1][0]:=-1; Vertexes[1][1]:=-1;
Vertexes[2][0]:=1; Vertexes[2][1]:= 1;
Vertexes[3][0]:=-1; Vertexes[3][1]:= 1;

setlength(TexCoords,4*2);
TexCoords[0][0]:=0; TexCoords[0][1]:=-1;
TexCoords[1][0]:=-1; TexCoords[1][1]:=-1;
TexCoords[2][0]:=0; TexCoords[2][1]:=0;
TexCoords[3][0]:=-1; TexCoords[3][1]:=0;

//VBO init.
glGenBuffers( 2, @vertexBuffer);

glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer[0]);
glBufferData( GL_ARRAY_BUFFER, sizeof(GLFloat)*(high(Vertexes)+1), @Vertexes[0], GL_STATIC_DRAW );
glBindBuffer( GL_ARRAY_BUFFER, 0);

glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer[1]);
glBufferData( GL_ARRAY_BUFFER, sizeof(GLFloat)*(high(TexCoords)+1), @TexCoords[0], GL_STATIC_DRAW );
glBindBuffer( GL_ARRAY_BUFFER, 0);

glEnableClientState( GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Эта процедура, которую всё время вызывает таймер}
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[0]);
glVertexPointer( 2, GL_FLOAT, 0, nil);
glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer[1]);
glTexCoordPointer(2, GL_FLOAT, 0, nil);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
end;
Если вы сделаете такой же пример, то увидите на экране квадрат.

Теперь разберём как отрисовать десять квадратов с использованием GL_ARB_draw_instanced. Всё очень просто. Это расширение вводит новую команду glDrawArraysInstancedARB. Значение первых четырёх параметров совпадает с glDrawArrays, а именно способ рисования, первый индекс, количество вершин. Пятый параметр задаёт количество копий объекта. Замените в предыдущем примере glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) на glDrawArraysInstancedEXT(GL_TRIANGLE_STRIP, 0, 4,10) и, поздравляю, вы вывели десять квадратов. Проблема только в том, что позиции у них совпадают пиксель в пиксель. Что делать? В GLSL существует атрибут gl_InstanceID, который показывает вершинному шейдеру, точки какого примитива сейчас проходят через него. Да, наша программа несколько усложниться из-за использования шейдеров, но другого пути нет. Нам нужно отрисовывать VBO буфер с использованием вот таких вот шейдеров
//FP
void main(void)
{
gl_FragColor = vec4( 0.4, 0.0, 0.9, 1.0 );
}
//VP
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex + gl_InstanceID;
}
В вершинном шейдере я использовал атрибут gl_InstanceID весьма хитрым образом, в отличии от Борескова. Я просто прибавил номер примитива к координате каждой его вершины. В итоге на экране вы увидите домино из квадратов.

Это всё. 
Удачи!
Вопросы оставляйте в комментариях.

Справка.
glDrawArraysInstanced () работает аналогично glMultiDrawArrays (), за исключением того, что, первый индекс и вершинный номер (как указано в первом и рассчитывать, соответственно), являются одинаковыми для каждого вызова glDrawArrays ().
Рекомендую ссылку: http://ptgmedia.pearsoncmg.com/images/9780321552624/samplepages/0321552628_Sample.pdf
 
GL_ARB_instanced_arrays
используется на новейшем железе. 


Источник: http://ptgmedia.pearsoncmg.com/images/9780321552624/samplepages/0321552628_Sample.pdf
Категория: My articles | Добавил: DungeonLords (2009-08-13)
Просмотров: 1498 | Комментарии: 1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright Forcer, Inc © 2024
    Бесплатный конструктор сайтов - uCoz