Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2012, 23:40   #1
Nikk[UA]
Пользователь
 
Регистрация: 24.01.2011
Сообщений: 41
По умолчанию Отрисовка масива пикселей opengl

Всем привет. Я пишу простенькую двухмерную игру, но уже столкнулся с трудностями.

Когда я отрисовую изображение по пикселю то в розрешении 800х600 фпс падает до 5

Мне предложили идею отрисовки масива пикселей как одного изображения. Я пробовал рисовать битмап в огле и фпс действительно возрос до 120.
Такой вопрос как масив пикселей максимально быстро отрисовать как одно изображение не переводя в битмап.

Вот код отрисовки:
Цитата:
procedure RendW;
var
x, y : integer;
begin
for x:= 0 to 800 do
for y:= 0 to 600 do
begin
GLPointSize(1);
GLBegin(GL_POINTS);
glColor3d(1,0,0);
glVertex2d(2*x/800-1,2*y/600-1);
GLEnd;
end;

end;
Nikk[UA] вне форума Ответить с цитированием
Старый 08.06.2012, 15:40   #2
IvanBegin
Пользователь
 
Регистрация: 04.02.2010
Сообщений: 10
По умолчанию

зачем тебе opengl для двумерной игры?
IvanBegin вне форума Ответить с цитированием
Старый 08.06.2012, 17:19   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

затем что тогда работает видюха и можно применятьь всякие красивости, что за флуд?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.06.2012, 18:24   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Ваш код(сохраняя вашу логику) можно ооочень круто оптимизировать

Код:
procedure RendW;
var
 x, y : integer;
begin
 GLPointSize(1);
 GLBegin(GL_POINTS);
 for x:= 0 to 800 do
  for y:= 0 to 600 do
  begin
   glColor3d(1,0,0);
   glVertex2d(2*x/800-1,2*y/600-1);
  end;
 GLEnd;
end;
Правда есть один вопрос. А текстуры использовать никак?
В принципе есть еще glDrawPixels.
Но если не использовать текстуры, то толку от GL абсолютно НОЛЬ, может даже будет FPS меньше чем у GDI.
Kostia вне форума Ответить с цитированием
Старый 08.06.2012, 18:38   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

при обработке точками в принципе не очень выгодна. там свои методы для точек(типа червей например)
а тупо закрасить экран лучше прямоугольником.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.06.2012, 20:26   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Одного универсального алгоритма пригодного для всех случаев нет, поэтому для графики и используются различные технологии.
В зависимости от поставленной задачи.
Опишите свою задачу, и мы попытаемся порекомендовать оптимальный способ отрисовки именно для нее.

Кстати, как показывает практика, и процессором (т.е. без OpenGL, etc.) можно достаточно быстро (те же 120 fps) отрисовывать картинку даже на при тактовой частоте процессора 0.1 ГГц.
s-andriano вне форума Ответить с цитированием
Старый 09.06.2012, 10:25   #7
Nikk[UA]
Пользователь
 
Регистрация: 24.01.2011
Сообщений: 41
По умолчанию

Я додумался все пиксели записать в массив и отрисовывать как одно изображение.ФПС поднялось до 60. Только теперь мне нужен альфа канал, так как под этим миром из пикселей находится еще картинка заднего фона.

Вопрос: как модернизировать этот код, чтобы был альфа канал?

объявление массива:
Цитата:
World : Array [0..3999, 0..3999, 0..2] of GLUbyte;
загружаем изображение в массив:
Цитата:
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile ('map.bmp');
For i := 0 to 3999 do
For j := 0 to 3999 do begin
PixCol := Bitmap.Canvas.Pixels [j, i];
World[4000 - i - 1][j][0] := PixCol and $FF;
World[4000 - i - 1][j][1] := (PixCol and $FF00) shr 8;
World[4000 - i - 1][j][2] := (PixCol and $FF0000) shr 16;
end;
BitMap.FreeImage;
Рендерим всю картину
Цитата:
glRasterPos2f(-5, 5);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glDrawPixels(4000, 4000, GL_RGB, GL_UNSIGNED_BYTE, @World);
Nikk[UA] вне форума Ответить с цитированием
Старый 09.06.2012, 12:16   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

4 байта на пиксель, а далее формат пикселя RGBA.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.06.2012, 14:40   #9
Nikk[UA]
Пользователь
 
Регистрация: 24.01.2011
Сообщений: 41
По умолчанию

Это сделал. Теперь изображение вообще не рендерится. Тупо черный экран.

Что еще нужно вписать?
Nikk[UA] вне форума Ответить с цитированием
Старый 10.06.2012, 17:54   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Значит, неправильно сделал.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL. Проекционные тени и их отрисовка на плоскости стен комнаты capta1n Помощь студентам 1 07.12.2011 19:48
Отрисовка ребер в OpenGL Xcopy Помощь студентам 0 14.05.2011 13:02
Отрисовка пикселей поверх всех окон TilerDerton Общие вопросы Delphi 4 29.09.2010 10:35
Отрисовка метафайла средствами OpenGL -=CHIP=- Мультимедиа в Delphi 3 20.09.2009 13:12
Отрисовка круга в OpenGl Oburec Мультимедиа в Delphi 1 04.07.2009 15:22