OpenAL część pierwsza


Warsztat - Programowanie gier komputerowych :: OpenAL - część pierwsza







Strona główna Forum Szukaj Lista użytkowników
Grupy
Zarejestruj Zaloguj

Artykuły
Kliknij na kategorię żeby dodać artykuł Szukaj
Programowanie gier » Artykuły [Wersja do drukowania]
OpenAL - część pierwsza
Opis Podstawy programowania dźwięku przestrzennego na
potrzeby gier 3D...
Autor Gość Data Sro 16 Lut, 2005 9:20 pm Typ **
Słowa klucze
Kategoria Artykuły
Odsłony 335


OpenAL - część pierwsza
Podstawy programowania dźwięku przestrzennego na
potrzeby gier 3D...

OpenAL – część pierwsza.
Słowo wstępne:
OpenAL to wieloplatformowy interfejs (API) do
programowania dźwięku w przestrzeni trójwymiarowej.
Zasadniczym celem interfejsu jest umożliwienie
programiście zdefiniowania źródła dźwięku w
cyber-przestrzeni wokół odbiorcy i tworzenie właściwego
zanikania oraz przemieszczania się dla każdego źródła,
żeby dane środowisko sprawiało wrażenie przestrzennnego.
Przykładowe zjawiska fizyczne, jak np. efekt Doppler'a,
także są zaimplementowane w OpenAL. Poprzez tzw.
rozszerzenia, istnieje możliwość rozwijania standardu.
Wiele już powstałych aplikacji wykorzystuje OpenAL w
wersji 1.0, chociaż sama biblioteka powstała z myślą o
zastosowaniu w grach komputerowych (i one też korzystają
z OpenAL). Składnia funkcji OpenAL nawiązuje do OpenGL.

Jeśli chodzi o poniższy dokument to jest on częścią z
przewodnika, który mam nadzieję, w całości będzie
dostępny na “Warsztacie”.

Odrobina teorii:

Używanie OpenAL bazuje na posługiwaniu się trzema
obiektami podstawowymi – Buforami, Źródłami i
Słuchaczem. Bufor może być wypełniony zawartością audio
i wtedy jest możliwe przekazanie go do źródła. Źródło
jest ustawiane w przestrzeni i odtwarzane. Sposób w jaki
słyszymy odgrywany dźwięk zależy od umiejscowienia
wirtualnego słuchacza w przestrzeni (słuchacz jest tylko
jeden). Stworzenie kilku źródeł, buforów oraz
pojedynczego słuchacza i rozmieszczanie pozycji i
orientacji tychże obiektów w sposób dynamiczny pozwala
kreować przekonujące złudzenie dźwięku przestrzennego.

Odrobina praktyki:

Teraz stworzymy program z wykorzystaniem OpenAL. Na
początku trzeba sciągnąć tak zwane Software Development
Kit (SDK) do OpenAL. A więc proszę:

http://www.openal.org/

Rozpakowujemy SDK'i i jeśli pracujemy w VC++ 6.0 to:

Tools -> Options -> Directories

Do “include files” dodajemy katalog “include” z SDK'ów.
Do “library files” dodajemy katalog “libs” z SDK'ów.

A jeśli pracujemy w innym kompilatorze to już sami
musimy kombinować. Zacytowałbym tu takie powiedzenie o
kombinowaniu, trochę rymowane i trochę no... nie do
cytowania [sic!].

Aplikacja do tego artykułu jest prosta, nieskomplikowana
i nawet nie posiada okna (opiera się na przepięknej
DOS'owej konsoli [ble!]). Wszystko dla uchwycenia istoty
posługiwania się OpenAL, a nie WinAPI. Stworzymy
aplikację, która odgrywa melodię ze źródła położonego w
(0.0f, 0.0f, 0.0f) i słuchacza w tym samym punkcie. Zero
efektów przestrzeni – zwykłe odtwarzanie sampla.

Czas na kod:

Tworzymy pustą aplikację konsolową. Konsolidujemy
aplikację z “openal32.lib” oraz “alut.lib” (Project ->
Settings -> Link). Tworzymy sobie “main.cpp” i można
działać:

#include
#include
#include

void main()
{
// inicjalizacja biblioteki //
alutInit(0, NULL);
// czyszczenie stanu błędów //
alGetError();

/*** TUTAJ KODZIMY NASZE WYNALAZKI ***/

// kończymy naszą przygodę //
alutExit();

return;
}

Tak wygląda sprawa z inicjalizacją i deinicjalizacją
biblioteki OpenAL. Najłatwiejszą drogą do zainicjowania
biblioteki OpenAL jest wywołanie funkcji alutInit().
Funkcja przyjmuje dwa parametry, a jeśli ustawimy je
kolejno na (0, NULL) to utworzone zostanie urządzenie
domyślne. Inicjalizacja tym sposobem oszczędza
programiście tworzenia tzw. kontekstów OpenAL (różne na
różnych platformach systemowych). Wywołanie funkcji
alGetError() jest wywołaniem pustym, a jedynym celem
takiego postępowania jest czyszczenie stanu błędów,
który mógłby wskazywać na jakieś śmiecie z pamięci.
Inaczej mówiąc - ZAWSZE NA POCZĄTKU WYWOŁUJEMY
alGetError() i nie sprawdzamy wartości zwracanej.
Funkcja alutExit() jest jednym ze sposobów na
deinicjalizację.

Aluint iBuffer = 0;
alGenBuffers(1, &iBuffer);

if (alGetError() != AL_NO_ERROR)
{
cout<<”Nie udało się stworzyć bufora !!!”< return;
}

Funkcja alGenBuffers() zajmuje się tworzeniem buforów i
przyjmuje dwa parametry. Pierwszy to ilość buforów jaką
chcemy stworzyć, a drugi to wskaźnik do zmiennej typu
całkowitego. Potem sprawdzamy błędy i jak wszystko idzie
dobrze to lecimy dalej.

// zmienne pomocnicze - potrzebne do załadowania pliku
*.wav //
ALenum eFormat = 0;
ALsizei iSize = 0;
ALvoid* pData = NULL;
ALsizei iFreq = 0;
ALboolean bLoop = AL_FALSE;
// ładujemy wave'a i pozyskujemy zeń informacje //
alutLoadWAVFile(“001.wav”,&eFormat,&pData,&iSize,&iFreq,&bLoop);

// przekazujemy dane z pliku do naszego BUFORA //
alBufferData(iBuffer,eFormat,pData,iSize,iFreq);
// zwalniamy zmienne pomocnicze //
alutUnloadWAV(eFormat,pData,iSize,iFreq);

Jak ktoś chce to może dodać obsługę błędów czyli
sprawdzać wartość zwracaną alGetError() po każdym
wywołaniu funkcji. Teraz bufor zawiera dane, które
później sobie odegramy.

Aluint iSource = 0;
alGenSources(1, &iBuffer);

if (alGetError() != AL_NO_ERROR)
{
cout<<”Nie udało się stworzyć źródła !!!”< return;
}

Funkcja alGenSources() zajmuje się tworzeniem źródeł i
przyjmuje dwa parametry. Pierwszy to ilość źródeł jaką
chcemy stworzyć, a drugi to wskaźnik do zmiennej typu
całkowitego. Potem sprawdzamy błędy i tak dalej...

// przekazujemy bufor do źródła //
alSourcei(iSource,AL_BUFFER,iBuffer);
// próbkowanie na 1.0 – normalna prędkość //
alSourcef(iSource,AL_PITCH,1.0f);
// głośność na 1.0 – maksymalna //
alSourcef(iSource,AL_GAIN,1.0f);
// odtwarzamy bez pętli //
alSourcei(iSource,AL_LOOPING,AL_FALSE);

To była taka mała konfiguracja naszego źródła. Warto
wspomnieć, że wartści dla AL_GAIN są znormalizowane
czyli należy je przekazywać z zakresu do 0.0f do 1.0f.

alDistanceModel(AL_FALSE);

Ta jedna linijka kodu oznacza wyłączenie efektów
przestrzeni, a w naszym wypadku jest równoważne z
umieszczeniem słuchacza i wszystkich źródeł w środku
układu współrzędnych.

// odgrywamy źródło //
alSourcePlay(iSource);
// zmienna pomocnicza do sprawdzania stanu źródła //
ALint iSourceState = AL_PLAYING;

// jeśli gra muzyka to rób pętlę aby się program nie
skończył //
while (iSourceState == AL_PLAYING)
{
// przekazujemy stan odtwarzania do iSourceState //
alGetSourcei(iSource,AL_SOURCE_STATE,&iSourceState);
}

// no i mała DESTRUKCJA (aaa !!! bang, bang, buum !!!)
//
alDeleteBuffers(1,&iBuffer);
alDeleteSources(1,&iSource);
alutExit();

TU JEST PLIK Z KODEM ŹRÓDŁOWYM
www.republika.pl/daxmatar/openal1.zip

UWAGA !!! Przykładowy sampel “001.wav” dołączony do
przykładu jest mojego autorstwa i jeśli chcesz go
jakkolwiek wykorzystać [sic!] skontaktuj się ze mną i
przygotuj walizkę z pieniędzmi [ha_ha!].

POZDROWIENIA Z PODZIEMIA !!!


Skocz do: Wybierz forumWarsztat - Programowanie
gier komputerowych|--Szkółka| |--Szkółka -
języki| |--Szkółka - grafika| |--Szkółka -
inne|--Programowanie gier| |--Ogólnie|
|--Dźwięk| |--Sztuczna Inteligencja|
|--Inne|--Programowanie grafiki|
|--Programowanie grafiki| |--OpenGL|
|--DirectX|--Produkcja| |--Pomysły|
|--Projektowanie| |--Projekty| |--Grafika|
|--Ogłoszenia|--O czym innym| |--Konferencje,
spotkania| |--Warsztat| |--Aktualności|
|--Artykuły| |--Wykłady| |--Compo|
|--Lepperlandia|--Śmietnik| |--Z odrzutu



Powered by Knowledge Base, wGEric (C) 2002 PHPBB.com MOD
This script (Knowledge Base - MX Addon v. 1.03e) is modified
by Haplo





W1.5b (C) 2004
[admin: ayufan, g[R]eK, Goliatus, mikael_, Regedit]
Wszystkie czasy w strefie CET (Europa)

Powered by phpBB2 Plus 1.52 based on phpBB 2.0.10 © 2001, 2002 phpBB
Group :: FI Theme :: Mody i Podziękowania












Wyszukiwarka

Podobne podstrony:
część pierwsza
VBA część pierwsza
buddyjska tradycja gelug czesc pierwsza eioba
Afirmacje czesc pierwsza(1)
METODY NUMERYCZNE CZESC PIERWSZA
2 Część pierwsza
pyt 3 część pierwsza KULTURA MINOJSKA
Noss Kurs EAGLE Część pierwsza
Disslowa Jak gotować część pierwsza

więcej podobnych podstron