Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > OpenGL Context виджета.


Автор: evilguard 16.7.2008, 14:12
как создавать 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; Но почему-то это все не работает - цвет фона, который я установил черным - не меняется, а так и остается таким же серым как и вся остальная форма.

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

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


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

Автор: evilguard 16.7.2008, 17:51
понятно - на форме рисуется замечательно. Я щас заставил работать с компонентом TPanel - но вот беда - у него нельзя перехватить сообщение onPaint -  и поэтому при системных вызовах перерисовывается компонент, а не opengl содержимое.

Автор: evilguard 17.7.2008, 07:42
Нашел вот что: http://faqs.org.ru/forum/viewtopic.php?p=54000&sid=8972bdb7c2eea535b1d62cdd1a2bfe16
Здесь в самом начале описывается создание как раз такого контрола, какой нужен для вывода opengl - в TPanel перехватывается WM_Paint и WM_ERASEBKGND. Проблема решена то есть smile

Автор: Aslan74 7.2.2010, 14:33
Замените PaintBox на ScrollBox и все заработает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)