Grafika 3D
 
  Zarejestruj się
::  Newsy  ::  Pliki  ::  Twoje Konto  ::  Forum  ::
Menu
· Strona główna
· Forum
· Linki
· Lista u?ytkowników
· O nas...
· Pliki
· Statystyki
· Twoje Konto
Tutoriale
· API
· Matematyka
· Teoria
· Direct3D
· OpenGL
· Techniki
Kto Jest Online
Aktualnie jest 45 gość(ci) i 0 użytkownik(ów) online.

Jesteś anonimowym użytkownikiem. Możesz się zarejestrować za darmo klikając tutaj
Tutoriale - OpenGL - Multipass

Hello people. Jak powiedziałem ostatnim razem dzisiaj zajmiemy się multitexturingiem. Mimo iż nazwa jest troszkę przydługawa, to jednak sam efekt jest w gruncie rzeczy prosty do zrozumienia i zaimplementowania przy pomocy OpenGL. Cóż więc kryje się za tą nazwą? Jest to efekt bazujący, dla odmiany :)), na mieszaniu (jak więc widzicie mieszanie jest podstawą bardziej zaawansowanych technik graficznych i bez niego ani rusz), polegający na tym, że na obiekt nakładana jest więcej niż jedna tekstura. Niby nie jest to nic aż "tak" wspaniałego, jednakże bez tego dzisiejsza grafika nie oferowałaby tylu ciekawych efektów. Jakich? No takich jak choćby wymieniany już przeze mnie kilkakrotnie bumpmapping, nakładanie lightmap i jeszcze kilka. Owszem dałoby się to osiągnąć techniką, którą się dziś zajmiemy (tak, tak nie jest to "prawdziwy" multitexturing, ale zwyczajowo już, ściema :), jednakże wymagałoby to zbyt dużo mocy obliczeniowej, a tej oczywiście zawsze mamy za mało.

Sam efekt można uzyskać dwoma metodami. Pierwsza z nich polega na wielokrotnym renderowaniu tej samej sceny z odpowiednio ustawionymi parametrami blendingu (to właśnie ta ściema). Drugi sposób polega na wykorzystaniu udogodnień oferowanych nam przez nasze karty graficzne w postaci wielu jednostek teksturujacych. Czyli na wyrenderowaniu danej sceny tylko raz, ale z ustawionymi odpowiednimi parametrami mieszania tekstur. Od razu widać, że druga metoda jest znacznie szybsza, szczególnie przy modelach o dużej liczbie trójkątów. Co to są jednostki teksturujące i jak z nich korzystać powiem w następnym tutsie. Dziś jednak zajmiemy się metodą pierwszą, a to dlatego, żeby pokazać wam, jak prostą sprawą jest multitexturing, bo niestety następnym razem będzie straszna sieczka, jako że będę musiał omówić rozszerzenia OpenGL :)))). Tak więc do roboty - kod w zasadzie jest taki sam, jak w przykładzie z blendingu, wiec wszystko powinno być jasne.
GLuint	texture[2];
Jak widać rozszerzyliśmy tablice przechowującą tekstury - teraz będą dwie. Kod wczytujący tekstury też nieco się zmienił, jednakże po chwili zauważymy, że jest to tak naprawdę ten sam kod, tyle że powtórzony dwa razy, więc nie ma sensu go omawiać.

W zasadzie cała reszta też pozostała bez zmian, oprócz funkcji renderującej, która jest dla nas dziś najważniejsza (jak zawsze zresztą :)) i na której się teraz skupimy.
glBlendFunc(GL_ONE,GL_ZERO);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glDrawArrays(GL_QUADS, 0, 24);

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glDrawArrays(GL_QUADS, 0, 24);
Tak więc od razu widzimy, że rzeczywiście kostka jest renderowana dwukrotnie.
glBlendFunc(GL_ONE,GL_ZERO)
Początkowo ustawiamy blending tak, aby był nakładany tylko kolor tekstury. Jeśli pamiętacie wzór blendingu, to na pewno wiecie, że przy takim ustawieniu kolor nakładany jest równy kolorowi źródła, czyli tekstury.
glBindTexture(GL_TEXTURE_2D, texture[0]);
glDrawArrays(GL_QUADS, 0, 24);
Dalej to oczywiście ustawienie bieżącej tekstury i wyrenderowanie kostki. Bardziej interesująca przedstawia się jednak druga część, szczególnie ta z funkcją blendingu.
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
W zasadzie używając blendingu niejednokrotnie spotkacie się z sytuacją, iż różne parametry dają ten sam (albo bardzo podobny - różnice są często praktycznie niezauważalne) efekt. Dlaczego tak się dzieje? Ano wynika to z wzoru jakim się posługujemy oraz tego, że w wielu przypadkach dane wartości koloru/alfa są takie same, lub podobne. Po co to mówię? Po to, że bardzo możliwe, iż uzyskacie ten sam (albo lepszy/gorszy) efekt używając innych parametrów. Nie wiem, bo szczerze mówiąc nie sprawdzałem, ale zapewne jest to możliwe. Ja używam tego wzoru, więc go wyjaśnię. Po pierwsze chcemy osiągnąć efekt połączenia dwóch tekstur. Aby tego dokonać musimy w jakiś sposób zmieszać kolory tekseli (pikseli tekstury). Najlepiej je wymnożyć i to właśnie robimy. Pierwszy parametr to kolor przeznaczenia, czyli kolor piksela w buforze. Jeśli przypomnimy sobie wzór blendingu, to okaże się, że pierwszy fragment operacji wygląda następująco :

KOLOR_ŹRÓDŁA*KOLOR_PRZEZNACZENIA

Czyli dokładnie to o co nam chodziło. Jednakże pamiętamy, że musimy dodać jeszcze drugą część wzoru. Tutaj mamy dwie możliwości (w zasadzie mamy więcej, ale ja omówię dwie z nich, które są dostępne w przykładzie :P). Możemy albo przeprowadzić operacje modulowania koloru raz (czyli prawie tak jak GL_MODULATE przy jednej teksturze), albo przeprowadzić tą modulację dwa razy i dodać efekty. Końcowy efekt będzie się różnił jasnością. Ja wybrałem efekt pierwszy, bo uważam, że lepiej się nadaje do tego przykładu, ale przy innych teksturach drugi sposób może dać lepsze efekty. Działa on mniej więcej tak. Wiadomo, że kolor jest ograniczony do przedziału [0, 1]. Wiemy również, że kolor biały to 1 dla wszystkich składowych. Jeśli się więc zastanowimy, to oczywistym stanie się fakt, że nie możemy pozwolić na to, aby kolor biały był nakładany na obiekt, ponieważ nie było by widać efektów mieszania - tam gdzie na drugiej teksturze był biały na obiekcie też będzie biały niezależnie od efektów mieszania, czyli chcemy, aby druga połowa równania była równa 0, lub bliska 0. Tak więc chcemy spowodować, aby na ekranie pojawiały nam się efekty pierwszej modulacji, a tylko niekiedy był dodawany kolor (np. czarny). To właśnie robimy podając jako drugi parametr GL_ONE_MINUS_DST_ALPHA. Czyli traktujemy kolor pikseli jako wartości dla kanału alfa. Łatwo zauważyć, że efekt tej operacji dla koloru białego jest równy 0, bo 1-1=0 :)))). Specyficzne dla tej operacji jest to, że efekt jest dość ciemny (przeważnie tekstury zawierają raczej ciemne kolory - nas ta kwestia nie dotyczy, bo druga tekstura jest biała).
Drugą możliwością jest dwukrotna modulacja kolorów i suma otrzymanych wyników. Uzyskany efekt jest znacznie jaśniejszy niż poprzedni, co w wielu wypadkach jest lepszym rozwiązaniem - szczególnie przy nakładaniu zwykłych (często np. zdjęć ściany) tekstur. Oba efekty możecie sobie oczywiście obejrzeć - dzisiejsze demko jest troszkę bardziej interaktywne :)), i możecie zmienić sobie ustawienia blendingu naciskając klawisz M.

I to już koniec na dzisiaj. Myślę, że nie mieliście większych kłopotów ze zrozumieniem. Jeśli jednak nie za bardzo rozumiecie skąd to się wszystko wzięło to proponuje jeszcze poczytać sobie o blendingu i porobić jakieś przykłady, bo bez tego, jak widać, nie zajdziecie daleko.



Kod źródłowy

©Copyright by Domino   



Tutoriale - OpenGL
Nasze newsy s� w RSS: backend.php
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Tworzenie strony: 0.09 sekund

:: Layout strony został stworzony przez www.nukemods.com w oparciu o styl phpbb2 Helius, którego autorem jest Cyberalien ::