Сохранить сцену OpenGL в TBitmap - glReadPixels возвращает пустые данные? - PullRequest
1 голос
/ 15 мая 2011

Я пытаюсь сохранить созданную OpenGL сцену как TBitmap. У меня проблема в том, что glReadPixels возвращает все пустые данные (все 0). Мысли о том, почему это произойдет? Я пытаюсь захватить текущий контекст OpenGL. (дисплей на экране все работает нормально). Это с Delphi 7 под Windows.

var
   pbuf: pointer;
   y: integer;
   bmp: TBitmap;
   p1, p2: pointer;
begin
   GetMem( pbuf, pnScene.Width * pnScene.Height * 4);
   glReadPixels( 0, 0, pnScene.Width, pnScene.Height, GL_RGBA, GL_UNSIGNED_BYTE, pbuf);
   //<------  pbuf now contains all 0's  ---------->

   bmp := TBitmap.Create;
   bmp.PixelFormat := pf32bit;
   bmp.Width := pnScene.Width;
   bmp.Height := pnScene.height;

   for y := 0 to (pnScene.Height -1) do
   begin
      p1 := bmp.ScanLine[y];
      p2 := pointer( integer(pbuf)+ (y * bmp.Width * 4));
      CopyMemory( p1, p2, bmp.Width * 4);
   end;

   bmp.SaveToFile( 'c:\test\temp.bmp');
   bmp.Free;
   FreeMem( pbuf);
end;

И предложения / мысли приветствуются!

Добавление:

В конечном итоге планировалось сделать вызов glReadPixels () сразу после рендеринга вызовов для целей записи видео. Когда я это сделал, все работало нормально, так что это оказалось не проблемой.

Ответы [ 3 ]

4 голосов
/ 15 мая 2011

Убедитесь, что вы делаете это из того же потока, где вы создали контекст GL.Если это функция обратного вызова, которую вы предоставляете сторонней библиотеке, она может выполняться в другом потоке, даже если вы этого не понимаете.Это случилось со мной один раз, и все, что я получил, было нули, как и вы.

3 голосов
/ 15 мая 2011

Я предполагаю, что вы хотите получить изображение, которое уже было передано в передний буфер окна с двойным буфером Затем попробуйте добавить glReadBuffer(GL_FRONT) перед glReadPixels(...)

0 голосов
/ 26 января 2016

В цикле for вы должны изменить оператор:

p1 := bmp.ScanLine[y];

до

p1 := bmp.ScanLine[OpenGlPanel.Height -1 -y];

В противном случае скопированное растровое изображение будет перевернуто.

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