Использование OpenGL для рисования непосредственно в .NET Bitmap - PullRequest
2 голосов
/ 18 февраля 2010

Я бы хотел использовать OpenGL для рисования непосредственно в .NET System :: Drawing :: Bitmap (C ++ / CLI). Кажется, это должно работать так:

char buf[48];
ZeroMemory( &buf, sizeof(buf));
System::Drawing::Bitmap bmp(
    4,
    4,
    12,
    Imaging::PixelFormat::Format24bppRgb,
    (System::IntPtr)buf);
Graphics^ g = Graphics::FromImage(%bmp);
HDC local_hdc = (HDC)((void*)g->GetHdc());
HGLRC local_hrc = wglCreateContext( local_hdc );
if(!wglMakeCurrent( local_hdc, local_hrc ))
    ShowError();

//Draw something with OpenGL ...

g->ReleaseHdc((IntPtr)((void*)local_hdc));

//Do something with the bitmap ...

Но wglMakeCurrent завершается с ошибкой «Недопустимый формат пикселей».

"Конечно!" Я думаю. «Мне просто нужно установить формат пикселя растрового изображения таким образом, чтобы OpenGL мог отображать его!»

К сожалению, если я использую вышеупомянутый конструктор Bitmap, я ограничусь перечислением стандартных пиксельных форматов, а не структурой, содержащей кучу атрибутов, которые я могу ИЛИ вместе. И я не думаю, что возможно установить формат пикселя после факта.

В любом случае, такой способ работы был бы более красивым, чем использование набора вызовов Win32 для создания независимого от устройства растрового изображения, но в стандартных форматах пикселей, по-видимому, отсутствует какой-либо вид поддержки GL, и я просто терплю неудачу. Можете ли вы добиться успеха?

1 Ответ

3 голосов
/ 23 февраля 2010

Вы, вероятно, в любом случае не хотите рисовать непосредственно в буфер, вы потеряете все аппаратное ускорение, что является преимуществом OpenGL для начала. Вместо этого:

  • Настройте контекст OpenGL как обычно, используя видеопамять.
  • Вбери в себя, полностью ускоряйся.
  • Создание растрового изображения.
  • Вызовите Bitmap :: LockBits, чтобы получить указатель на необработанную пиксельную память.
  • Используйте glCopyImage для считывания результатов из видеопамяти в растровое изображение.

PixelFormat, переданный LockBits и glCopyImage в последних двух шагах, должен совпадать, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...