Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.049 c
6-1095672033
kot_phg
2004-09-20 13:20
2004.11.28
Как уменьшить время ожидание пакета в компоненте TcpClient?


14-1100172167
Ega23
2004-11-11 14:22
2004.11.28
Я вернулся.


14-1099975942
YurikGL
2004-11-09 07:52
2004.11.28
Посмотреть!!!


14-1099924567
Piter
2004-11-08 17:36
2004.11.28
А где находятся функции типа KeSetTimer, KeWaitForSingleObject?


6-1095624621
Klopan
2004-09-20 00:10
2004.11.28
Scan of 21, 80 ports





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский