Форум: "Игры";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизБыстрая отрисовка тайлов через 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c