Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Быстрая отрисовка тайлов через OpenGL   Найти похожие ветки 

 
Zer0 ©   (2004-07-28 17:33) [0]

Задачка такая : есть массив из 80x50 элементов, каждый из которых имеет свой цвет и одну из 256 текстур. (цвета и текстуры постоянно меняются так что display lists не подходят)
Нужно отрисовать эту матрицу с максимальносй скоростью на экран.

Вроде как есть triangle strips только как ими пользоваться если каждый тайл имеет свою текстуру?

p.s. для интересующихся - нужно сэмулировать текстовый режим под OpenGL, только цветов будет не 16 а 2^24 =)


 
Белый Крыс ©   (2004-07-28 19:09) [1]

Смотря как рисовать будешь? Если просто glVertex3fv, то тут проблем нет (в смысле одной клетки), а вот полосу...
Если у тебя 256 текстур, значит каждый символ в отдельном файле? Тут все просто. Загоняешь в массив и рисуешь
Ну например

type
 TVertex = record
   X, Y, Z : glFloat;
 end;
...
var
 Cell : array [0..3] of TVertex;
 TexCell : array [0..3] of TVertex
...
 glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);

 glVertexPointer  ( 3, GL_FLOAT, 0, @Cell);
 glTexCoordPointer( 2, GL_FLOAT, sizeof(TVertex), @TexCell);

 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

 glDisableClientState(GL_VERTEX_ARRAY);
 glDisableClientState(GL_TEXTURE_COORD_ARRAY);

В Cell вершины расположены зигзагом, аналогично и текстурные координаты. Т.е. :
(0, 0, 0)
(1, 0, 0)
(0, 0, 1)
(1, 0 ,1)
Оба моссива могут быть константы - все равно менять ничего не надо. А перемещать клетку через glTranslatef.
Если Все символы в одном файле, то надо будет просто менять текстурные координаты.


 
Zer0 ©   (2004-07-28 19:36) [2]

помоймю любые операции с матрицами (в том числе и перемещения) в опенгле работают не очень быстро.
glTranslatef придется совершить 4000 раз.

cейчас я создаю общий GL_T2F_C3F_V3F массив и поэлементно рисую на экране при помощи GL_QUADS, но такой метод занимает достаточно много времени =(
да и масссив получается нехилым на каждый элемент - 8*4*4=128 байт (повторно можно было бы использовать 3 точки)
итого 512000 байт, которые каждый кадр передаются видяхе.


 
Белый Крыс ©   (2004-07-28 22:22) [3]

1) GL_QUADS -> GL_TRIANGLE_STRIP, как то слышал, что быстрее GL_QUADS тормозят, конечно может это и не правда, но хуже не будет. Тем более, что все остальные (GL_QUADS, GL_POLYGON...) основаны именно на "треугольных" примитивах.
2) Если у тебя все в одном большом массиве, то используй расширение GL_ARB_vertex_buffer_object(VBO). Прирост будет заметен.
3) Если значения массива не меняются каждый кадр, то вообще сказка(VBO). Данные хранятся в видеокарте.
4) Там, где пробел, рисовать не надо вообще. Думаю, ты и сам догадался :))
5)Быстро или нет не знаю. Но вот попытаться стоит - данное кол-во не должно вроде идти медленнее 16мс.


 
wiz ©   (2004-07-29 19:43) [4]

Решение 1: перед выводом сортируем char"ы по номерам или сразу храним в таком формате:
TChar = TPoint (или просто) = record x,y:byte; end;
TCharList = array of TChar;
TText = array [0..255] of TCharList;

Выводим сортируя по символам, подключая нужную тектуру один раз на цикл. Таким образом мы сократили количество переключений текстуры до 256max... (а не 4000 как у тебя).

..........................................

Пока писал сей чудный пост - понял, что всё это фигня и делание через одно место...

На самом деле надо так!

Решение 2:

1) При загрузке графики (символов) пихаем все картинки чаров N*M в одну bmp например размера 16*N x 16*M.

2) биндим данную текстуру. (заметьте всего одну!!!)

Вывод полосы через TRIANGE_STRIP у тебя не получится (я тоже думал что можно, а потом понял, что никак)... если не догадаешься почему - картинка:

1 - 2
|   |
3 - 4
|   |
5 - 6
|...|

так что

3) выводим всё через GL_QUADS (или через GL_TRIANGLE_STRIP для 4-х точек, что однофигственно, т.к. одинаковое количество данных по шине)

ЗЫ: ну и конечно, можно попользовать VBO или подобное, если сделать правильную структуру хранения в памяти.

...........................................

есть еще прибавка к 1: можно запихать чары (т.е. квад с текстурными координатами) в дисплейный список и оттуда их вырисовывать (может даже довольно быстро получиться)...


 
wiz ©   (2004-07-29 19:47) [5]

Придумал еще одно решение...

Решение 4 (ассиметричное): создаём в памяти bmp"уху размером с экран (или чуть больше)... Или несколько bmp"ух... в них рисуем то, что нужно.

Потом прибиваем их к опенгл как текстуры.
Далее один (или несколько) GL_QUAD и voila!



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.057 c
4-1097776220
dkDimon
2004-10-14 21:50
2004.11.28
Список папок/файлов


4-1092111253
Stype
2004-08-10 08:14
2004.11.28
Программа общения с COM портом


3-1099023202
sanek
2004-10-29 08:13
2004.11.28
как сложить цифровые данный из разных ячеяк таблици


1-1100241460
TankMan
2004-11-12 09:37
2004.11.28
Скажите как запускать коммандную строку с досовскими командами?


1-1099953946
xmrz
2004-11-09 01:45
2004.11.28
Delphi и Corel Draw