Войти
ПрограммированиеФорумГрафика

Open GL в дочернем окне (5 стр)

Страницы: 1 2 3 4 5
#60
15:24, 9 апр 2019

Тарас-Прогер
> Где лучше взять HDC для wglCreateContext?
Хэндл дескриптора устройства можно получить через GetDC ( window_handle ).
> BeginPaint? А его вообще можно вне сообщениях WM_PAINT вызывать?
Конечно можно вызывать и кроме как при обработке сообщения WM_PAINT, только смысл.
> GetWindowDC? Надо ли его освобождать?
Контекст устройства при создании рендера нужен лишь несколько раз, а после "связывания" контекстов его можно не трогать. ReleaseDC вызовется лишь раз, в конце работы приложения.
> Надо ли освобождать HGLRC?
Да, как только тебе он больше не понадобится можешь высвободить контекст.
> Приложение может иметь только один HGLRC?
Их может быть несколько. Всё зависит от преследуемых целей.
> Или можно хоть на каждое дочернее окно одного и того же главного окна по своему HGLRC зафигачить?
Можно.
> Я пока сомневаюсь, нужно ли мне одно 3D окно, или два. Точнее, следует ли мне
> рисовать карту в 2D с помощью GDI, или рендерить её в 3D с птичьего полёта
> второй камерой, смотрящей вертикально вниз.
И то, и то это лишний проход рендеринга. Для карты часто используется отдельная 2D текстура, подготовленная заранее.
> А HDC для wglCreateContext надо перед рисованием каждого кадрика заново получать? Или можно один раз?
Один раз создал, связал с устройством и пользуйся.
> А сам HGLRC надо крейтить с помощью wglCreateContext заново для каждого кадрика, или
> достаточно сделать это один раз?
Один. Раз.
> Если один раз, то после какого события это можно делать? В конце WM_CREATE того окна, куда
> Open GL выводить будет? Или в конце WM_SIZE этого окна? А может в первом WM_PAINT? В
> следующем WM_PAINT после первого WM_SIZE? А если каждый раз, то после какого события
> можно начинать?
Создавай контекст после создания окна. И WM_PAINT, и WM_SIZE, и WM_CREATE вызываются несколько раз, так что создавать внутри обработки сообщения не надо, создавай между.

> А что приложено-то? Соответственно, в чьих исходных кодах?
Статья Гуревича, ссылку на которую nonamezerox дал. Соответственно, все коды там.

#61
16:23, 9 апр 2019

PA3UJIb
> Статья Гуревича, ссылку на которую nonamezerox дал. Соответственно, все коды
> там.
Я не про это спросил. В цитате поминаются коды чего-то, приложенного. А чего приложенного не сказано. И в статье тоже.

#62
16:30, 9 апр 2019

PA3UJIb
> Хэндл дескриптора устройства можно получить через GetDC ( window_handle ).
PA3UJIb
> И то, и то это лишний проход рендеринга. Для карты часто используется отдельная
> 2D текстура, подготовленная заранее.
Во-первых по карте будут или корабли и зверьё, или красные, жёлтые и зелёные отметки ползать. А во-вторых будут перемещаться и сами острова относительно персонажа, за которого предложено играть. Так что целиком статичной её сделать как раз нельзя. А если было бы можно, то карту лучше было бы положить на фон отдельного окна и показывать по команде в подменю about. А нарисовать фон в паинте и менять кординаты вывода всего битмапа, или рисовать всё кодом – это уже нюансы, которые я не поминал. В 3D, кстати, статичный битмап можно положить на отдельную пару трианглов, а сверху корабли и зверьё кинуть и всё это рендерить. Я пока не уверен, как карту делать буду. Может быть пририсую отметки к бимпапу. А может и нет. В видовом окне дымки тоже не будет. Кинуть высвободившиеся ресурсы на "ИИ", или на ещё один рендер? Чёрт его знает.

#63
16:44, 9 апр 2019

PA3UJIb
> Создавай контекст после создания окна. И WM_PAINT, и WM_SIZE, и WM_CREATE
> вызываются несколько раз, так что создавать внутри обработки сообщения не надо,
> создавай между.
WM_CREATE вызывается ровно 4 раза. Но для разных окно. Для одного и того же окна один раз. Это создание окна. А остальные окна других классов, соответственно, у них другие оконные процедуры. WM_SIZE и WM_PAINT вызываются многократно. Но можно же реагировать только на первое сообщение WM_PAINT в данное конкретное окно. А WM_SIZE вызывается один раз на изменение размера. При изменении размера контекст пересоздавать не надо? А то в некоторых GDI софтинах контекст создаётся, в том числе, после каждого WM_SIZE, но не в самом WM_SIZE, а в следующем WM_PAINT.

#64
20:14, 9 апр 2019

Тарас-Прогер
> А точно также – это как?
Под виндой - так:

  HDC hdc=GetDC(hwnd);
  if(!hdc)
      return false;
    PIXELFORMATDESCRIPTOR pfd;
  memset(&pfd,0,sizeof(pfd));
  pfd.nSize     = sizeof(pfd);
  pfd.nVersion  = 1;
  pfd.iLayerType  = PFD_MAIN_PLANE;
  pfd.cColorBits  = bpp;
  pfd.cDepthBits  = depth;
  pfd.cStencilBits= stencil;
  pfd.dwFlags     = PFD_SUPPORT_OPENGL|PFD_DRAW_TO_WINDOW|(PFD_DOUBLEBUFFER&-(doubleBuffer!=0));
    //??? GetPixelFormat
    //??? DescribePixelFormat
  int pf=ChoosePixelFormat(hdc,&pfd);
  if(!pf)
      return false;
  if(!SetPixelFormat(hdc,pf,&pfd))
        return false;
  HGLRC hrc=wglCreateContext(hdc)
  if(!hrc)
        return false;
  if(!wglMakeCurrent(hdc,hrc))
        return false;
  return true;

И переключатся между hrc

> В связи с этим вопрос. Где лучше взять HDC для wglCreateContext?
я беру HDC и HGLRC один раз при создании окна GetDC(hwnd)
и работает
> Надо ли освобождать HGLRC?
надо, при уничтожении окна
> Приложение может иметь только один HGLRC?
сколько угодно, иначе в чем смысл?
> В конце WM_CREATE того окна, куда Open GL выводить будет?
> Или в конце WM_SIZE этого окна?
Рисайзы не влияют никак

> Линкер такой функции не знает:
> |21|undefined reference to `__imp_wglCreateContext'|
Добавь в проект gl.lib или gl.def, полученный из gl.dll
В Borland есть утилита implib, в VS вроде ручками пишут DEF - давно не пользовался

Страницы: 1 2 3 4 5
ПрограммированиеФорумГрафика

Тема в архиве.