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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TWinControl c OpenGL 
:(
    Опции темы
RomanEEP
Дата 7.10.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

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



Кто-нибудь поделится компонетом с OpenGL или классом-оберткой для создания OpenGL контекста с поддержкой сглаживания (FSAA)
Я написал свой класс который устанавливает макс сглаживание поддерживаемое видеокартой столкнулся с множеством проблем
1)На некоторых карта от NVidia контекст не создается если в настройках стоит Сглаживание = Управляемое от приложения
2)Выдает Floating point overflow на некоторых ATI картах
3)Не знаю как убить OpenGL контекст из самого контрола - в деструкторе Handle на котором создается контекст не существует и выдается AV при удалении текстур. По идее это надо  оверрайдить DestroyWindowHandle - но процедура почему-то не вызывается

Мой код:
Код


во временном окне создаю контекст так:
procedure SetPF(DC: HDC);
var
  nPixelFormat: Integer;
  pfd: TPixelFormatDescriptor;
  err: Integer;
begin

  // Initialise the form's DC for OpenGL, and setup a palette.
  FillChar(pfd, SizeOf(pfd), 0);
  with pfd do
  begin
    nSize        := SizeOf(TPixelFormatDescriptor);
    nVersion     := 1;
    dwFlags      := PFD_DRAW_TO_WINDOW or
                    PFD_SUPPORT_OPENGL;
    dwFlags      := dwFlags or PFD_DOUBLEBUFFER;
    iPixelType   := PFD_TYPE_RGBA;
    cColorBits   := 24;
    cAlphaBits   := 0;
    cDepthBits   := 0;
    cStencilBits := 0;
    iLayerType   := PFD_MAIN_PLANE;
  end;

  nPixelFormat := ChoosePixelFormat(DC, @pfd);
  if nPixelFormat = 0 then
  begin
    err := GetLastError;
    raise Exception.Create('Couldn''t set pixel format for temp window - '
      + IntToStr(Err));
  end;

  if not SetPixelFormat(DC, nPixelFormat, @pfd) then
  begin
    err := GetLastError;
    raise Exception.Create('Couldn''t set pixel format for temp window - '
      + IntToStr(Err));
  end;

end;

procedure TGLContext.CreateRC;
var
  TW: TTempGLWindow;
  DisplayBPP: Integer;

  function GetDisplayBPP: Integer;
  var
    DC: HDC;
  begin
    DC := CreateDC('DISPLAY', nil, nil, nil);
    if DC <> 0 then
      begin
        try
          Result := GetDeviceCaps(DC, BITSPIXEL) * GetDeviceCaps(DC, PLANES);
        finally
          DeleteDC(DC);
        end;
      end
    else
      Result := 0;
  end;


begin
  GLWriteLog('Creating OpenGL context');

  TW := TTempGLWindow.CreateNew(Application, 0);
  try
    ReadImplementationProperties;
    ReadExtensions;
    GLWriteLog('Vendor: ' + glGetString(GL_VENDOR));
    GLWriteLog('Renderer: ' + glGetString(GL_RENDERER));
    GLWriteLog('Version: ' + glGetString(GL_VERSION));
    GLWriteLogExt('WGL_ARB_pixel_format',WGL_ARB_pixel_format);
    GLWriteLogExt('GL_ARB_multisample',GL_ARB_multisample);
  finally
    TW.Free;
  end;

  FDC   := GetDC(FControlHandle);
  if FDC = 0 then
  begin
    GLWriteLog('Can not get descriptor of rendering window');
    Exit;
  end;
  //Âûáèðàåì ïîäõîäÿùèé ôîðìàò ïèêñåëÿ
  DisplayBPP := GetDisplayBPP;
  if ARBFSAA and GL_ARB_multisample then
  begin
    if not SetDCPixelFormat(DisplayBPP, 24, 8) then
      if not SetDCPixelFormat(DisplayBPP, 24, 4) then
        if not SetDCPixelFormat(DisplayBPP, 24, 2) then
          if not SetDCPixelFormat(DisplayBPP, 24, 0) then
            if not SetDCPixelFormat(DisplayBPP, 16, 0) then
            begin
              GLWriteLog('Can not set up pixel format');
              Exit;
            end;
  end
  else if not SetDCPixelFormat(DisplayBPP, 24, 0) then
    if not SetDCPixelFormat(DisplayBPP, 16, 0) then
    begin
      GLWriteLog('Can not set up pixel format');
      Exit;
    end;

  if MemoryContext then
    SetPalette(FDC);

  FGLRC := wglCreateContext(FDC);
  if FGLRC=null then
  begin
    GLWriteLog('Can not create OpenGL context');
    Exit;
  end;
  FRCAvailable := True;
  MakeCurrent;
  GLWriteLog('OpenGL context has been created');

  ReadExtensions;
  ReadImplementationProperties;
  MaxTextureSize := MaxTextureSize;
  GLWriteLog('Max texture size = '+IntToStr(MaxTextureSize));

  if not (GL_VERSION_1_0) then
    MessageDlg('There is no OpenGL library on the computer',
      mtError, [mbOK], 0);

  if not (GLU_VERSION_1_1) then
    MessageDlg('There is no GLU library on the computer',
      mtError, [mbOK], 0);

  SetDefaultOptions;

  TextManager.CreateRC(FDC);
  Model.ContextCreated;
  Background.ContextCreated;
  MtList.ContextCreated;
  {$IFDEF 3DCHECKGLERROR}
  CheckOpenGLError;
  {$ENDIF}
end;

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

Запрещено:

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

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

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

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


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

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


 




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


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

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