Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> opengl screenshot, сделать скриншот игры 
V
    Опции темы
developer2007
  Дата 30.3.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: -2



Необходимо делать скриншоты игрушки на OpenGL, которая в режиме fullscreen. Люди добрые, помогите кто чем может smile 

Это сообщение отредактировал(а) developer2007 - 30.3.2009, 22:14
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
Alexeis
Дата 30.3.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



  Насколько я знаю это нужно делать через DirectDraw, но вот вопрос как подгадать так чтобы не получить часть старого кадра и часть нового, ведь синхронизировать не получиться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
developer2007
Дата 30.3.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: -2



Вот темку видел рядом, может её как-то можно приспособить под это дело?
http://forum.vingrad.ru/forum/topic-25805/...shot/index.html
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
developer2007
Дата 31.3.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: -2



Нашёл у немцев интересный топик:
http://www.delphipraxis.net/topic52353_ren...ext+opengl.html
Кто знает немецкий, подсобите. Код оттуда не срабатывает.

Код

procedure glSaveScreen(pFilename : String);
var
Viewport : array[0..3] of TGLint;
JPG      : TJPEGImage;
RGBBits  : PRGBQuad;
Pixel    : PRGBQuad;
BMP      : TBitmap;
Header   : PBitmapInfo;
x,y      : Integer;
Temp     : Byte;
begin
glGetIntegerv(GL_VIEWPORT, @Viewport);
GetMem(RGBBits, Viewport[2]*Viewport[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, Viewport[2], Viewport[3], GL_RGBA, GL_UNSIGNED_BYTE, RGBBits);
// Screenshot als JPG speichern
JPG := TJPEGImage.Create;
BMP := TBitmap.Create;
BMP.PixelFormat := pf32Bit;
BMP.Width       := Viewport[2];
BMP.Height      := Viewport[3];
GetMem(Header, SizeOf(TBitmapInfoHeader));
with Header^.bmiHeader do
begin
biSize        := SizeOf(TBitmapInfoHeader);
biWidth       := Viewport[2];
biHeight      := Viewport[3];
biPlanes      := 1;
biBitCount    := 32;
biCompression := BI_RGB;
biSizeImage   := Viewport[2]*Viewport[3]*4;
end;
// Rot und Blau vertauschen
Pixel := RGBBits;
for x := 0 to Viewport[2]-1 do
for y := 0 to Viewport[3]-1 do
  begin
  Temp       := Pixel.Red;
  Pixel.Red  := Pixel.Blue;
  Pixel.Blue := Temp;
  inc(Pixel);
  end;
SetDIBits(Bmp.Canvas.Handle, Bmp.Handle, 0, Viewport[3], RGBBits, TBitmapInfo(Header^), DIB_RGB_COLORS);
//bmp.SaveToFile('bitmap.bmp');
JPG.CompressionQuality := 100;
JPG.Assign(BMP);
JPG.SaveToFile(pFileName);
FreeMem(Header);
FreeMem(RGBBits);
JPG.Free;
BMP.Free;
end;

--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
Alexeis
Дата 31.3.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



После строчки 
Код

glReadPixels(0, 0, Viewport[2], Viewport[3], GL_RGBA, GL_UNSIGNED_BYTE, RGBBits);

Можно проверить содержимое RGBBits. Там должна быть картинка, хотя неплохо бы сначала занулить память перед вызовом этой функции. 
Можно просто сохранить в файл, а затем просмотреть WinHex ом записалось ли туда что-то.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rickert
Дата 31.3.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Уточните:
0) У вас есть программа, которая использует OpenGL, и вам нужно в определённый момент её выполнения, "сфотографировать" область OpenGL контекста?
1) Или вы пишите программу (следовательно имеете доступ к исходникам), которая что-то рисует через OpenGL, и вам надо сохранить определённый кадр в определённый момент?
Если первое - то я хз.
Если второе - то смотрите описание функции glReadPixels()


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
developer2007
Дата 31.3.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: -2



0. Мне надо сделать скрин в совершенно посторонней игрушке.
P.S. У меня W2K8 (можно сказать Vista), в массиве glGetIntegerv(GL_VIEWPORT, @Viewport); Viewport значения 2,3 пустые, а в 0,1 какие-то левые. TGlint объявлен как Integer.

Это сообщение отредактировал(а) developer2007 - 31.3.2009, 10:25
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
Rickert
Дата 31.3.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Тогда я - хз. Попробуйте программу SnagIT.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
developer2007
Дата 31.3.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: -2



А толку мне от этой программы? Мне надо в своём приложении такую фишку сделать.
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
baldina
Дата 31.3.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



developer2007, операции с OpenGL API не помогут, т.к. надо работать в том же gl контексте, что и та прога. 
что-то мне подсказывает, что достаточно получить HDC экрана,  и дальше работать с ним через gdi

что-то вроде
Код

HDC hdc0 = GetDC(0); 
HDC hdc = CreateCompatibleDC(hdc0); 
long width = GetDeviceCaps(hdc0, HORZRES); 
long height = GetDeviceCaps(hdc0, VERTRES); 
HBITMAP hbmp = CreateCompatibleBitmap(hdc0, width, height); 
HBITMAP hbmpOld = (HBITMAP)SelectObject(h_dc, h_bmp); 

BitBlt(hdc, 0, 0, width, height, hdc0, 0, 0, SRCCOPY); 

HPALETTE hPalette = SelectPalette(hdc, NULL, FALSE); 
SaveBitmap(hbmp, hPalette, <filename.bmp>); 

SelectObject(hdc, hbmpOld); 
DeleteObject(hbmp); 
DeleteDC(hdc); 
ReleaseDC(0, hdc0);


(простите, на с++ у меня быстрее выходит, но суть думаю ясна)
PM MAIL   Вверх
developer2007
Дата 31.3.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: -2



Увы, BitBlt здесь не катит, все способы с апишными функциями для скриншотов были испытан - обычно чёрный квадрат. Я подозреваю, что надо внедрить длл-ку в игру и хукнуть opengl, но что именно - знаний не хватает. У меня есть сырцы на С++ универсального съёма скриншота, подходит для DirectX 8, DirectX9, OpenGL. Но там целый проект и самому мне в них разобраться сложно, чтобы взять нужный кусок и на дельфи перевести. Там даже запись в видео реализована. Если есть желание помочь, аську в ЛС послал.

Это сообщение отредактировал(а) developer2007 - 31.3.2009, 15:06
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
baldina
Дата 31.3.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата

все способы с апишными функциями 

а какие еще есть способы? можно проделать то же самое через DirectX. Есть подозрение, что дело в скорости обновления экрана - функции не успевают обработать кадр. С этим можно наверно бороться установками в самой игре.

Цитата

надо внедрить длл-ку в игру и хукнуть opengl

уже есть такое
gDebugger - http://www.gremedy.com им можно, например, приостановить игру в нужном месте. возможно, после этого обычный PrtScr заработает

Цитата

сырцы на С++ универсального съёма скриншота

Цитата

Там даже запись в видео 

тут наверняка без т.н. mirroring видео драйвера не обошлось... не чересчур для простой задачки съема скриншотов?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.