Faces Of Nature - Informatyka - OpenGL - JPG, JPEG w OpenGL
Faces of nature   »  

Informatyka  »   OpenGL

(1) Tekstury z plików JPG, JPEG, PNG i innych

Krótka notatka, jak szybko zaimportować plik formatu graficznego (JPG, PNG, ...) na użytek aplikacji OpenGL.

  1. Biblioteka graficzna Corona - dostępna w wersji binarnej do użycia pod Windows. Umożliwia ładowanie m.in. JPG, PNG. Ściągamy, wrzucamy corona.h do include/, corona.lib do lib/.
  2. Ładowanie pliku graficznego np. tak:
    corona::Image *img = corona::OpenImage(filename);
    if (img)
    {
    	...
    }
    
  3. Pobranie parametrów obrazu
    img->getWidth(); img->getHeight();
    switch(img->getFormat())
    {
      case corona::PF_B8G8R8A8: 
        img = ConvertImage(img, corona::PF_R8G8B8A8);
        format = GL_RGBA; break;
    
      case corona::PF_R8G8B8A8:
        format = GL_RGBA; break;
    
      case corona::PF_R8G8B8:
        format = GL_RGB; break;
    	
      ...
    }
    img->getPixels();
    
  4. Odwrócenie kolejności - tekstura OpenGLa domyślnie jest tablicą, taką że pierwszy jej bajt dotyczy dolnego lewego rogu obrazu. Natomiast pliki graficzne zapisywane są tak, że pierwszy dotyczy górnego lewego, dlatego przed wysłaniem mapy bitowej należy odwrócić ją o współrzędną X:
    FlipImage(TexImage, corona::CA_X);
    
  5. Utworzenie tekstury
    glTexImage2D(GL_TEXTURE_2D, 0, format, 
      img->getWidth(), img->getHeight(), 0, format,
      GL_UNSIGNED_BYTE, img->getPixels());
    
  6. Usunięcie niepotrzebnej już mapy bitowej
    delete img;
    

Do ściągnięcia przykładowy program korzystający z biblioteki Corona. Uwaga! Pamiętaj o rozdzielczości obrazu będącej iloczynem dwóch potęg liczby 2. (wymagane przez glTexImage2D). opengl_jpg.zip (9 Kb)


(2) Dźwięk w aplikacjach C++

Jak szybko dodać obsługę plików dźwiękowych (WAV, OGG, FLAC, MP3, MOD, AIFF...) ?
Np. dzięki bibliotece Audiere (Ah Dee Air).

Dostępną dla Dev-C++ również jako pakiet dostępny na stronach G-Productions albo DevPacks.org.

Krótki tutorial, w większości wzięty z dokumentacji biblioteki Audiere.

  1. Pliki nagłówkowe i przestrzeń nazw
    #include <audiere.h>
    using namespace audiere;
    
  2. Inicjalizacja urządzenia, domyślnego:
    AudioDevicePtr device(OpenDevice());
    if (!device)
    {
    	// failture
    }
    
    Sama funkcja
     OpenDevice (
    	const char* name = 0, 
    	const char* parameters = 0);
    
    pozwala na załadowanie konkretnego urządzenia w tym pustego null dostępnego (prawdopodobnie?) na każdej platformie.
  3. Otwieranie pliku dźwiękowego.
    Są dwa sposoby, albo jako strumień z pliku, albo ładowanie do pamięci. Muzyka w tle powinna być raczej ładowana jako strumień - oszczędzaj pamięć (trzeci argument true w funkcji OpenSound) a krótkie efekty do pamięci (false), aby w każdej chwili mogły być szybko odtworzone.
    OutputStreamPtr sound(
    	OpenSound(device, "music.wav", true));
    if (!sound)
    {
    	// failture
    }
    
  4. Ustawienia dźwieku - API
    Nazwy mówią raczej same za siebie:
    sound->play();
    sound->stop();
    sound->isPlaying(); // return bool
    sound->reset();
    
    sound->setRepeat(bool repeat); // false | true
    sound->getRepeat(); 
    
    sound->setVolume(float vol);	// 0.0f - 1.0f
    sound->getVolume();
    
    //setPan: -1.0 = left, 0.0 = center, 1.0 = right
    sound->setPan(float pan);
    sound->getPan();
    
    // 0.5 - 2.0, 1.0 - default (100% speed)
    sound->setPitchShift(float shift);
    sound->getPitchShift(); 
    
    sound->getLength();    // get number of frames
    
    sound->setPosition(0); // set current frame
    sound->getPosition();
    
    
    
Faces of nature   »  

Informatyka  »   OpenGL