Вверх ↑
Этот топик читают: Гость
Ответов: 1309
Рейтинг: 49
#1: 2013-10-08 17:04:45 ЛС | профиль | цитата
Как вывести графику сгенерированную Open GL программно - чтобы сохранить в файл, например. Пытался - даже скриншот не снимает.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1304
Рейтинг: 405
#2: 2013-10-08 19:30:04 ЛС | профиль | цитата
Aziz, снял скрин без проблем на win64, есть и другой способ прочитать попиксельно с помощью GL_ReadPixels, данный способ очень долгий по времени, но с помощью его можно отрисовать из буфера без отрисовки на окне. Попадались в Нете способы и более быстрого рендера в битмап но мне данные манипуляции были не нужны.
code_31961.txt
карма: 3

1
файлы: 1code_31961.txt [4.7KB] [250]
Голосовали:Aziz
Ответов: 1309
Рейтинг: 49
#3: 2013-10-08 22:22:57 ЛС | профиль | цитата
MAV, встречал в нете тоже, вроде как там не попиксельно, а с помощью GL_ReadPixels сразу дамп буфера происходил. Или просто я не разобрался.

Кстати, в вашей схеме у меня работает только ReadPixels, на скриншоте выходит только кнопка на сером фоне.. Но спасибо, хоть будет от чего отплясывать с бубнами..))
------------ Дoбавленo в 22.22:
Вот нашел решение где вроде не попиксельно:

http://stackoverflow.com/questions/6006984/save-opengl-scene-to-a-tbitmap-glreadpixels-returning-empty-data

Procedure GetOGL_BMP(var BMP: TBitmap);
var
Dimensions: array [0 .. 3] of Integer;
RGBBits: PRGBQuad;
Pixel: PRGBQuad;
Header: PBitmapInfo;
x, y: Integer;
Temp: Byte;
begin
glGetIntegerv(GL_VIEWPORT, @Dimensions);
GetMem(RGBBits, Dimensions[2] * Dimensions[3] * 4);
glFinish;
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadPixels(0, 0, Dimensions[2], Dimensions[3], GL_RGBA, GL_UNSIGNED_BYTE,
RGBBits);
if not Assigned(BMP) then
BMP := TBitmap.Create;
BMP.PixelFormat := pf32Bit;
BMP.Width := Dimensions[2];
BMP.Height := Dimensions[3];
GetMem(Header, SizeOf(TBitmapInfoHeader));
with Header^.bmiHeader do
begin
biSize := SizeOf(TBitmapInfoHeader);
biWidth := Dimensions[2];
biHeight := Dimensions[3];
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := Dimensions[2] * Dimensions[3] * 4;
end;
// Rot und Blau vertauschen
Pixel := RGBBits;
for x := 0 to Dimensions[2] - 1 do
for y := 0 to Dimensions[3] - 1 do
begin
Temp := Pixel.rgbRed;
Pixel.rgbRed := Pixel.rgbBlue;
Pixel.rgbBlue := Temp;
inc(Pixel);
end;
SetDIBits(BMP.Canvas.Handle, BMP.Handle, 0, Dimensions[3], RGBBits,
TBitmapInfo(Header^), DIB_RGB_COLORS);

FreeMem(Header);
FreeMem(RGBBits);
end;


Только довести до компонента знаний не хватает.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1304
Рейтинг: 405
#4: 2013-10-09 00:27:06 ЛС | профиль | цитата
Поздно зашёл уже сегодня не успею глянуть
на скриншоте выходит только кнопка на сером фоне

а ОСь какая? и видеокарта не интел случайно?
карма: 3

0
Ответов: 1309
Рейтинг: 49
#5: 2013-10-09 00:38:29 ЛС | профиль | цитата
Ось вин 7, карта Ати радеон - ноут hp probook 4710s
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1304
Рейтинг: 405
#6: 2013-10-09 22:07:23 ЛС | профиль | цитата
Aziz, сделал пробный вариант на IC, скриншотит довольно шустро но в win7_64 имеются проблемки когда стиль окна не bsNone
screenshotogl.sha
карма: 3

1
файлы: 1screenshotogl.sha [4.7KB] [334]
Голосовали:Aziz
Ответов: 1309
Рейтинг: 49
#7: 2013-10-09 22:53:57 ЛС | профиль | цитата
MAV, перезалей схемку плиз, а то форум пишет error.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1304
Рейтинг: 405
#8: 2013-10-09 23:07:30 ЛС | профиль | цитата
перезалил
карма: 3

0
Ответов: 1309
Рейтинг: 49
#9: 2013-10-10 11:32:03 ЛС | профиль | цитата
MAV, круто, спасибо, теперь начнем эксперименты!
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1376
Рейтинг: 198
#10: 2013-10-10 12:43:11 ЛС | профиль | цитата
Aziz, схема screenshotogl.sha работает через Canvas.Pixels, а вот вариант работающий через ScanLine, чуток быстрее, если пригодится...
code_31983.txt
карма: 1

2
файлы: 1code_31983.txt [4.8KB] [250]
Голосовали:Aziz, MAV
Ответов: 1309
Рейтинг: 49
#11: 2013-10-10 13:05:20 ЛС | профиль | цитата
foksov, спасибо, да, гораздо быстрее - у меня первый 280 мс, второй 46.. Скриншоты это все конечно пригодится, но вот как напрямую из буфера мгновенно картинку получать - вот это было бы еще универсальнее. Но не знаю, возможно ли это. Может ли OGL создавать вывод на невидимой канве. Наверное, бред.) Вообще возможен "электроннный" вывод (невизуальный) из OGL?
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1376
Рейтинг: 198
#12: 2013-10-10 13:28:27 ЛС | профиль | цитата
Aziz писал(а):
Может ли OGL создавать вывод на невидимой канве. Наверное, бред.) Вообще возможен "электроннный" вывод (невизуальный) из OGL?
меня такое тоже интересует, будем ждать ответа гуру в OGL
Вот ещё пример, с выводом в Image, без сохранения
code_31984.txt
карма: 1

2
файлы: 1code_31984.txt [4.9KB] [297]
Голосовали:MAV, Aziz
Ответов: 1304
Рейтинг: 405
#13: 2013-10-10 13:48:54 ЛС | профиль | цитата
Aziz писал(а):
Вообще возможен "электроннный" вывод (невизуальный) из OGL

Aziz, да возможен, необходимо произвести рендер в "невидимый" буфер, а с него уже использовать картинку как текстуру. Собственно это возможности использования FBO. Элемент с примером я выкладывал. Хотя если результатом должен быть битмап то мы уже имеем в виде переменной Bmp: PBitmap;.
foksov, поправка даёт 5-тикратный прирост скорости. А вот насчёт 32 bit это в данном случае сомнительно, зачем на 25 процентов увеличивать файл добавляя альфа канал заполненный нулями?
ps: наверное стоит данную возможность в hiGL_Main, многие 3D движки умеють делать скриншоты без использования системных функций.

карма: 3

0
Ответов: 1376
Рейтинг: 198
#14: 2013-10-10 13:58:54 ЛС | профиль | цитата
MAV, перед сохранением можно и к 24 битам подогнать (Bmp.PixelFormat:=pf24bit;), типа "упаковать"
на скорости не должно отразиться
карма: 1

0
Ответов: 1304
Рейтинг: 405
#15: 2013-10-10 14:12:44 ЛС | профиль | цитата
foksov, в последнем примере раскоментируй Bmp.Free;, а отрисовку сцены надо запустить в паралельном потоке с задержкой 10 мс(как и на таймере).
карма: 3

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)