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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2010, 17:22   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
Лампочка Дельфи и OpenGL + прозрачность цвета

Всем привет. OpenGL выводит на контекст устройства графику. Так если я задаю вывод на канву формы (обычной) вот таким кодом к примеру:
Код:
procedure pSetDCPixelFormat(aHDC:HDC);
var
  nPFD:TPixelFormatDescriptor;
  nPixelFormat:Integer;
begin
  FillChar(nPFD,sizeof(nPFD),0);
  nPFD.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  nPixelFormat:=ChoosePixelFormat(aHDC,@nPFD);
  SetPixelFormat(aHDC,nPixelFormat,@nPFD);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  pSetDCPixelFormat(Canvas.Handle);
  HRC:=wglCreateContext(Canvas.Handle);
  WindowState:=wsMaximized;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  wglDeleteContext(HRC);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  wglMakeCurrent(Canvas.Handle,HRC);
  glClearColor(0.0,0.0,0.0,1.0);
  glClear(GL_COLOR_BUFFER_BIT);
  glViewport(0,0,ClientWidth,ClientHeight);
  glPointSize(200);
  glColor3f(1.0,1.0,1.0);
    glBegin(GL_POINTS);
      glVertex2f(1,1);
    glEnd;
  SwapBuffers(Canvas.Handle);
  wglMakeCurrent(0,0);
end;
Канва формы заливается черным цветом и рисуется одна четвертая часть круга справа вверху, если я задам прозрачность у формы:
Код:
transparentColor:=true;
transparentColorValue:=ClWhite;
То по идее через белый цвет я должен видеть рабочий стол. А этого не происходит. От сюда вопрос: почему? и: как исправить? Может быть этот стандартный метод не прокатывает с OpenGL? Заранее спасибо.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 20.11.2010, 21:38   #2
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Он не прокатывает ни с OpenGL, ни с DirectX. Всё это из-за присутствия эффектов при отрисовке формы. Выход один (я так уже делал). Формировать опеном изображение в PBO, затем из PBO делать виндовский блит на канву формы. Теряется скорострельность кадров, но зато это серавно быстрее чем обычно.
З.Ы. Это кстати метод разработчиков Opera. Они так ускоряют (аппаратно) графику в браузере. Где -то на забугорном ресурсе прочитал.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 20.11.2010, 21:46   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
но зато это серавно быстрее чем обычно
А есть где-нибудь тесты такие? А то что-то кажется, если с видеокарты перегонять изображение туда-обратно, это большие тормоза.

Последний раз редактировалось Somebody; 20.11.2010 в 21:49.
Somebody вне форума Ответить с цитированием
Старый 20.11.2010, 21:56   #4
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

notHaker, нашел вашу тему, созданную недавно, http://www.programmersforum.ru/showthread.php?t=114325, буду читать, то, что вам там порекомендовали, а с наводкой помогли, спасибо вам! (И как я не нашел ее до создания своей..) В общем спасибо, будут проблемы - обращусь. Только вот что такое PBO и FBO - не пойму никак... С поиском по инэту про PBO и FBO много тем накопал на нашем форуме. Я так понял, что PBO и FBO - это форматы текстур? т.е. картинки простые?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 20.11.2010 в 22:03.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 20.11.2010, 22:00   #5
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Ну подумайте сами... Залили в видюху текстуры-атласы, сложили там же изображение с учётом альфа-канала и прочих эффектов. Забрали битмап, а затем сделали блит (его винда поддерживает аппаратно) на нужную форму. Ну и получается одно "узкое" место - это "видюха -> система -> видюха", которое оптимизируем до неузнаваемости. Да, пересылка между системной памятью и видюшной очень медленная, но если сравнить с вычислениями альфа-канала на процессоре и, того хуже, эффектов ( размытие например ) определённо получается выигрыш! яркий тому пример - "Adobe Flash".

Цитата:
вот что такое PBO и FBO - не пойму никак...
PBO - Pixel Buffer Object. Старый проверенный способ.
FBO - Frame Buffer Object. Быстрый, но сравнительно новый. Поэтому не универсальный, т.к. работает не везде.

И всё это относится к расширениям OpenGL
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.

Последний раз редактировалось notHaker; 20.11.2010 в 22:02.
notHaker вне форума Ответить с цитированием
Старый 20.11.2010, 22:05   #6
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Спасибо за пояснение, буду копаться...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 21.11.2010, 02:03   #7
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
А этого не происходит.
А если дизайнтайм эти свойства выставить?
Правда у меня почему-то не четверть круга, а квадрат получается так.....
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 21.11.2010, 10:16   #8
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

DomiNick, не получается при дизайнтайм... а квадрат - потому что не включено glEnable(GL_POINT_SMOOTH);, вот тогда будет круг.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 21.11.2010, 17:24   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Без TransparentColor показывает круг, с TransparentColor стабильно показывает дырку в виде почему-то квадрата (причём раза в 3 больше точки)...
А с GL_TRIANGLES или GL_QUADS вроде всё нормально получается... (WindowsXP Professional SP3 FinalEdition)

Вот если TransparentColor включать рантайм (точнее после pSetDCPixelFormat), то жутчайшие артефакты получаются... х__х

P.S. А почему оно рисуется в MouseMove? Это ж как минимум неудобно...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL Изменение цвета revaldo666 Общие вопросы C/C++ 1 29.07.2010 11:51
Изменение цвета (opengl) revaldo666 Общие вопросы C/C++ 0 26.07.2010 15:13
OpenGL, прозрачность ассемблер123 Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 25.04.2010 20:08
можно ли определить код цвета с помощью дельфи ? kakawkin Общие вопросы Delphi 2 12.11.2009 16:34
Прозрачность MAcK Общие вопросы Delphi 2 21.03.2007 19:24