Autor Wątek: Screenshot w opengl  (Przeczytany 1050 razy)

Offline Kwazar

  • Użytkownik

# Marzec 20, 2010, 23:00:36
Witam!

Czy jest jakis prosty sposob zapisania backbuffera aplikacji do pliku w opengl?
Wiem, ze sa specjalne biblioteki, jednak chcialbym uniknac dodawania kolejnej w moim projekcie.

W directx sprawa jest bardzo prosta a w opengl?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Dab

  • Moderator
    • blog

# Marzec 20, 2010, 23:01:51
Najprościej SOIL (jest f-cja do zapisania screenshota). Nie trzeba nic linkować, wystarczy dorzucić parę .cpp-ków na krzyż.

Ale jeżeli nie, to glReadPixels i potem zapisanie tego do jakiegoś pliku graficznego.

Offline Xion

  • Redaktor
    • xion.log

# Marzec 20, 2010, 23:06:28
Cytuj
W directx sprawa jest bardzo prosta a w opengl?
Jeśli przez 'bardzoprostość' w DX rozumiesz renderowanie do tekstury i zapisanie tejże do pliku, to OGL na pewno też to potrafi :)

Offline Kwazar

  • Użytkownik

# Marzec 20, 2010, 23:15:58
W directx sprawa jest bardzo prosta a w opengl?
Jeśli przez 'bardzoprostość' w DX rozumiesz renderowanie do tekstury i zapisanie tejże do pliku, to OGL na pewno też to potrafi :)

W Dx by zrobic screenshota wystarczy napisac:
LPDIRECT3DSURFACE9 Screen = NULL;

D3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &Screen );

D3DXSaveSurfaceToFile( FileName.c_str(), D3DXIFF_JPG, Screen, NULL, NULL );
w Opengl nie jest juz tak rozowo :/

Siedze nad tym problemem w ogl juz pare godzin i narazie doszedlem do momentu, ze pobieram pixele funkcja glReadPixels ale jak to zapisac do pliku ?

Rozkminiam wlasnie SOIL, ale jezeli jest jakas alternatywa w opengl, lub cos innego sprytnego to wyslucham chetnie propozycji :)

//EDIT
Ok rozwalilem SOIL faktycznie lekka biblioteka wszystko dziala ok ale nie zapisuje jpg :/ tylko bmp tga i dds...
Tak wiec temat otwarty.
« Ostatnia zmiana: Marzec 20, 2010, 23:36:42 wysłana przez Kwazar »

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Marzec 20, 2010, 23:39:34
Ja ci proponuje Devil i Glee i Frame buffer Object

Zapiszesz ladnie do FBO scene potem Devilem wyeksportujesz do jakiegokolwiek formatu :)

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Marzec 20, 2010, 23:57:02
Cytuj
W Dx by zrobic screenshota wystarczy napisac:

   LPDIRECT3DSURFACE9 Screen = NULL;

   D3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &Screen );

   D3DXSaveSurfaceToFile( FileName.c_str(), D3DXIFF_JPG, Screen, NULL, NULL );
Zapomniałeś o Screen->Release(). ;)

Offline skoti

  • Użytkownik

# Marzec 21, 2010, 01:32:06
w Opengl nie jest juz tak rozowo :/
A tam gadasz głupoty ;p - jest łatwiej:
Czytasz ekran za pomocą glReadPixels do buffora, a później zapisujesz dane czym chcesz (DevIL, Freeimage, SDL...) - nie powinno zająć to więcej niż 3 linijki.

Offline Avaj

  • Użytkownik

# Marzec 21, 2010, 11:58:04
Od strony API wygląda to tak samo - zarówno w OpenGL jak i w D3D wczytujesz sobie paczkę bajtów odpowiadających kolorom. A co ty z tym zrobisz to już API nie obchodzi. W D3D masz D3DX, a do OpenGLa masz np SOIL.

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Marzec 21, 2010, 13:37:43
W Dx by zrobic screenshota wystarczy napisac:
Kod: (cpp) [Zaznacz]
LPDIRECT3DSURFACE9 Screen = NULL;

D3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &Screen );

D3DXSaveSurfaceToFile( FileName.c_str(), D3DXIFF_JPG, Screen, NULL, NULL );
w Opengl nie jest juz tak rozowo :/
O cholera... no patrz :)
Kod: (c) [Zaznacz]
void* Screen = malloc(sizeof(unsigned char)*Screen.W*Screen.H*3);

glReadPixels(0,0,Screen.W,Screen.H,GL_RGB,GL_UNSIGNED_BYTE,Screen);

JakasFunkcjaDoZapisu( FileName.c_str(),JPG,Screen,Screen.W,Screen.H,GL_RGB);
Free(Screen);


Btw. Po co ci JPG?
« Ostatnia zmiana: Marzec 21, 2010, 13:41:32 wysłana przez świrus »