#delphi #opengl
#delphi #opengl
Вопрос:
Я пытаюсь сохранить созданную 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:testtemp.bmp');
bmp.Free;
FreeMem( pbuf);
end;
И предложения / мысли приветствуются!
Добавление:
В конечном итоге планировалось поместить вызов glReadPixels() сразу после вызовов рендеринга для целей записи видео. Когда я это сделал, все сработало нормально, так что в итоге это оказалось чем-то вроде проблемы.
Комментарии:
1. Вы проверили наличие ошибок? Ошибка glGetError
2. Да, извините, я должен был упомянуть — никаких ошибок от glReadPixels ()
Ответ №1:
Убедитесь, что вы делаете это из того же потока, в котором вы создали контекст GL. Если это функция обратного вызова, которую вы предоставляете сторонней библиотеке, то она может выполняться в другом потоке, а вы даже не осознаете этого. Это случилось со мной однажды, и все, что я получил, были нули, как и вы.
Комментарии:
1. Это не было проблемой, но это привело меня к попытке внедрить glReadPixels () в местоположение, где в конечном итоге это было бы в любом случае (мой приведенный выше код был просто функцией тестирования) — и это сработало.
Ответ №2:
Я предполагаю, что вы хотите получить изображение, которое уже было заменено на передний буфер окна с двойной буферизацией. Затем попробуйте добавить glReadBuffer(GL_FRONT)
перед glReadPixels(...)
Комментарии:
1. Я действительно пробовал это, но, похоже, это ничего не изменило. Хотя я вижу, что это было бы чем-то, что, вероятно, должно быть там в любом случае, на случай, если последующий код изменит этот параметр.
Ответ №3:
В for
цикле вы должны изменить инструкцию:
p1 := bmp.ScanLine[y];
Для
p1 := bmp.ScanLine[OpenGlPanel.Height -1 -y];
В противном случае скопированное растровое изображение будет перевернутым.