Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL Context виджета. вывод Opengl не в форму/окно а в виджет 
:(
    Опции темы
evilguard
Дата 16.7.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



как создавать openGL контекст на форме - в сети полно примеров. мне нужно только в конкретном виджете:
Код

TgraphsFrm = class(TForm)
    pbGL: TPaintBox;
var
    pbGL_dc : HDC;
    pbGL_hrc: HGLRC;

procedure TgraphsFrm.FormCreate(Sender: TObject);
begin
  pbGL_dc := pbGL.Canvas.Handle;
  SetDCPixelFormat( pbGL_dc );
  pbGL_hrc:=wglCreateContext( pbGL_dc );
  wglMakeCurrent (pbGL_dc, pbGL_hrc);
  glClearColor (0, 0, 0, 1.0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  glEnable(GL_NORMALIZE);
end;

procedure TgraphsFrm.FormDestroy(Sender: TObject);
begin
  wglMakeCurrent(0, 0);
  wglDeleteContext(pbGL_hrc);
  ReleaseDC (pbGL.Canvas.Handle, pbGL_dc);
  DeleteDC (pbGL_dc);

  CleanForm; //bmp3D.Free;
  DisposeList(HistExternList);
end;

procedure TgraphsFrm.SetDCPixelFormat(_hdc:HDC);
var pfd : TPIXELFORMATDESCRIPTOR;
    nPixelFormat : Integer;
begin
 FillChar(pfd, SizeOf(pfd), 0);
 pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
 nPixelFormat := ChoosePixelFormat (_hdc, @pfd);
 SetPixelFormat (_hdc, nPixelFormat, @pfd);
end;

procedure TgraphsFrm.pbGLPaint(Sender: TObject);
begin
  glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  SwapBuffers(pbGL_dc);
end;

procedure TgraphsFrm.FormResize(Sender: TObject);
begin
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity;
 glViewport(200, 0, pbGL.ClientWidth, pbGL.ClientHeight);
 gluPerspective(45.0, pbGL.ClientWidth / pbGL.ClientHeight, 100.0, 1000000.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity;
 InvalidateRect(pbGL.Canvas.Handle, nil, False);
end;



Я в дельфи не силен - состряпал вот такую вот штуку - в отличие от примеров из сети используется хэндлер моего TPaintBox для получения контекста - pbGL.Canvas.Handle; Но почему-то это все не работает - цвет фона, который я установил черным - не меняется, а так и остается таким же серым как и вся остальная форма.
PM MAIL   Вверх
Alexeis
Дата 16.7.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



  Не могу точно сказать в чем проблема, но финт в том, что в wglMakeCurrent не нравиться графический дескриптор. Возможно потому что 
Цитата(справка по wglMakeCurrent)

GDI transformation and clipping in hdc are not supported by the rendering context.


  Для установки следует получить дескриптор того окна, которое под PaintBox (при помощи GetDC). После этого все работает.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
evilguard
Дата 16.7.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



понятно - на форме рисуется замечательно. Я щас заставил работать с компонентом TPanel - но вот беда - у него нельзя перехватить сообщение onPaint -  и поэтому при системных вызовах перерисовывается компонент, а не opengl содержимое.
PM MAIL   Вверх
evilguard
Дата 17.7.2008, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



Нашел вот что: http://faqs.org.ru/forum/viewtopic.php?p=5...1d62cdd1a2bfe16
Здесь в самом начале описывается создание как раз такого контрола, какой нужен для вывода opengl - в TPanel перехватывается WM_Paint и WM_ERASEBKGND. Проблема решена то есть smile
PM MAIL   Вверх
Aslan74
Дата 7.2.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.12.2004

Репутация: нет
Всего: нет



Замените PaintBox на ScrollBox и все заработает
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.