Конференция "Игры" » Как в OpenGL рендерить в битмап? [D5, WinXP]
 
  • Unknown user © (26.10.07 18:14) [0]
    Пробовал использовать флаг PFD_DRAW_TO_WINDOW при установке формата пикселя -не помогает :(
  • @!!ex © (26.10.07 19:16) [1]
    Задачу объясни.
  • DevilDevil (27.10.07 13:34) [2]
    хмм, интересно... а можно рендерить в TBitmap без создания окна ?
  • @!!ex © (27.10.07 16:39) [3]
    > [2] DevilDevil   (27.10.07 13:34)

    Можно рендерить в FrameBuffer или в PBUffer, без создания окна, вроде.
    Только Device Context все равно создавать придется.
  • DevilDevil (27.10.07 17:55) [4]
    а где-нибудь есть статейка/примерчик ?
  • @!!ex © (27.10.07 18:33) [5]
    Примером не помогу. Практически это не реализовывал никогда.
    Суть в том, что DC получаешь не от окна, а свое создаешь, вот и все.
    И RC соответственно от полученного DC делаешь.
    Ну а потом просто рендеришь в буффер как обычно.
  • Unknown user © (29.10.07 10:14) [6]
    @!!ex

    Как раз такая задача и стоит. Рендерить не в экранный буфер а в битмап. Правда DC я брал так Bmp.Canvas.Handle, наверное неправильно.
  • @!!ex © (29.10.07 10:30) [7]
    > [6] Unknown user ©   (29.10.07 10:14)

    Низя. Если нужно получить копию в битмапе - рендерь в буффер, а потом получай экран в массив с помощью glReadPixels. Ну а массив засунуть в битмап - не проблема.
  • homm © (29.10.07 21:44) [8]
    > [7] @!!ex ©   (29.10.07 10:30)
    > Если нужно получить копию в битмапе - рендерь в буффер,
    > а потом получай экран в массив с помощью glReadPixels. Ну
    > а массив засунуть в битмап - не проблема.

    Итого 2 преоразования, фвктически перегона по шине видеокрты… В дерикс можно сразу на любую плоскость рендирить…
  • @!!ex © (29.10.07 22:14) [9]
    > [8] homm ©   (29.10.07 21:44)

    Вроде говорят в OGL тоже можно, только как то через *****.
  • Unknown user © (30.10.07 11:50) [10]
    >Если нужно получить копию в битмапе - рендерь в буффер, а потом получай экран в массив с помощью glReadPixels

    спасибо, попробую.

    > Вроде говорят в OGL тоже можно, только как то через *****.

    Выяснить бы еще как это сделать :( имеется ведь флаг PFD_DRAW_TO_WINDOW для установки формата пикселя. я думаю, главная проблема здесь получить правильный DC. Подозреваю, что надо использовать CreateCompaitableDC и создавать DIB секцию средствами WinAPI. Кто знает, отзовитесь.
  • Unknown user © (30.10.07 12:17) [11]
    >Если нужно получить копию в битмапе - рендерь в буффер, а потом получай экран в массив с помощью glReadPixels

    есть одна проблема при использовании такого метода. при помощи glReadPixels можно получить копию экранного буфера с разрешением соответствующим экранному, но, к примеру, для печати я хочу иметь картинку с разрешением принтера. в этом случае glReadPixels не поможет.
  • @!!ex © (30.10.07 12:43) [12]
    > [11] Unknown user ©   (30.10.07 12:17)

    Хм. Вроде glReadPixels умеет читать с разрешением буффера, в который рендерится картинка. Соответственно если картинка рендерится в буфер с большим разрешением, то и glReadPixels поддерживает большое разрешение.
  • Unknown user © (01.11.07 10:17) [13]
    >Хм. Вроде glReadPixels умеет читать с разрешением буффера, в который >рендерится картинка. Соответственно если картинка рендерится в буфер с >большим разрешением, то и glReadPixels поддерживает большое разрешение.

    а если мне надо разрешение 6000х6000 пикс.? какая видеокарта поддерживает такое разрешение?
  • Sapersky (01.11.07 13:36) [14]
    http://www.mvps.org/directx/articles/tilerender/index.htm

    Для Direct3D, но можно, наверное, и в OGL сделать по тому же принципу.
  • Unknown user © (01.11.07 15:43) [15]
    > Для Direct3D, но можно, наверное, и в OGL сделать по тому же принципу.

    Да, это и есть рендер в битмап который я как раз и хочу заставить работать.
    Кто нибудь объясните мне как пользоваться флагом PFD_DRAW_TO_BITMAP при установке формата пикселя?
  • Unknown user © (05.11.07 10:04) [16]
    поделюсь результатами своих экспериментов


      Binf.bmiHeader.biSize:=SizeOf(TBitmapInfoHeader);
      Binf.bmiHeader.biWidth:=500;
      Binf.bmiHeader.biHeight:=500;
      Binf.bmiHeader.biPlanes:=1;
      Binf.bmiHeader.biBitCount:=24;
      Binf.bmiHeader.biCompression:=BI_RGB;
      Binf.bmiHeader.biSizeImage:=Binf.bmiHeader.biWidth*Binf.bmiHeader.biHeight*3;

      DC:=GetDC(Handle);
      Dib:=CreateDIBSection(DC, BInf, DIB_RGB_COLORS, Bits, 0, 0);
      ReleaseDC(Handle, DC);

      FDC:=CreateCompatibleDC(0);
      SelectObject(FDC, Dib);

      pfd.nSize:=Sizeof(TPixelFormatDescriptor);
      pfd.nVersion:=1;
      pfd.dwFlags:=PFD_DRAW_TO_BITMAP or PFD_SUPPORT_OPENGL or PFD_SUPPORT_GDI;
      pfd.iPixelType:=PFD_TYPE_RGBA;
      pfd.cColorBits:=24;
      pfd.cDepthBits:=16;
      pfd.iLayerType:=PFD_MAIN_PLANE;

     nPixelFormat:=ChoosePixelFormat(FDC,@pfd);
     SetPixelFormat(FDC, nPixelFormat, @pfd);




    этот код работает, SetPixelFormat возвращает true. но если вместо SelectObject(FDC, Dib) поставить SelectObject(FDC, Bitmap.Handle) - где Bitmap переменная типа TBitmap - уже не срабатывает.
  • homm © (05.11.07 21:32) [17]
    > но если вместо SelectObject(FDC, Dib) поставить SelectObject(FDC,
    > Bitmap.Handle) - где Bitmap переменная типа TBitmap

    Покажи весь код. Может ты не указываешь размеры, или стоит картинку DIB формата подсунуть.
  • Unknown user © (07.11.07 10:21) [18]
    Всем спасибо, разобрался. Забыл установить глубину цвета для битмапа. Вот рабочий код для рендеринга в битмап, пользуйтесь.
    FDC используется дальше для получения контекста рендеринга OGL а процедуру рисовки менять не нужно (разве что установку параметров вида под размеры битмапа а не клиентской области окна).


     Bitmap.Pixelformat:=pf24bit;
     FDC:=CreateCompatibleDC(0);
     SelectObject(FDC, Bitmap.Handle);

     pfd.nSize:=Sizeof(TPixelFormatDescriptor);
     pfd.nVersion:=1;
     pfd.dwFlags:=PFD_DRAW_TO_BITMAP or PFD_SUPPORT_OPENGL or PFD_SUPPORT_GDI;
     pfd.iPixelType:=PFD_TYPE_RGBA;
     pfd.cColorBits:=24;
     pfd.cDepthBits:=16;
     pfd.iLayerType:=PFD_MAIN_PLANE;

    nPixelFormat:=ChoosePixelFormat(FDC,@pfd);
    SetPixelFormat(FDC, nPixelFormat, @pfd);

  • zzz (10.04.08 02:52) [19]
    вот нарисовали мы в битмап..

    а как дальше в файл например это сохранить?
    у меня при попытке сохранения вылезает икзепшен "нехватает ресурсов системы"
 
Конференция "Игры" » Как в OpenGL рендерить в битмап? [D5, WinXP]
Есть новые Нет новых   [119099   +88][b:0][p:0.003]