Asi trochu predbiham. Kdyz jsem konecne uz vykreslil par objektu v prostoru, tak jsem narazil na problem s jejich pruhlednosti. (Tu jsem urcoval alfa kanalem pri nastavovani barvy.) Nektere objekty nejsou skrz jine videt. Zjistil jsem ze to zalezi na poradi v jakem byly vykresleny. Jak to vypada je na techto obrazcich.
Pri vypnutem DEPTH_TEST:
http://www.sweb.cz/jkufner.web/root.cz/2003-07-31/depth_test_off.png
Pri zapnutem DEPTH_TEST:
http://www.sweb.cz/jkufner.web/root.cz/2003-07-31/depth_test_on.png
Jak je videt, tak pri vypnutem DEPTH_TEST je pruhlednost celkem v poradku, ale pro zmenu je videt za roh (pokud to za rohem necham vyreslit az po rohu). Takze tudy cesta nevede.
Kompletni zdrojak je na:
http://www.sweb.cz/jkufner.web/root.cz/2003-07-31/3D.tar.bz2
(DEPTH_TEST se prepina klav. 'd' a zbytek je pod 'h')
Takze co musim udelat, aby se to vykreslilo jak ma?
Dobrý den,
s průhledností (resp. obecně blendingem) je to trošku ošidné, protože z principu fungování grafického akcelerátoru vyplývá, že u průhledných objektů opravdu záleží na pořadí vykreslování jednotlivých primitiv.
Tento problém se obecně řeší několika způsoby:
1. pokud vykreslujete POUZE neprůhledné objekty, lze bez dalších komplikací použít Z-buffer (resp. depth buffer). Ten si alokujete při startu aplikace a povolíte příkazem glEnable(GL_DEPTH_TEST). Objekty se mohou vykreslovat v libovolném pořadí, protože se automaticky provádí Z-test na každý vygenerovaný fragment.
2. pokud vykreslujete POUZE průhledné objekty (což se v reálu asi nikdy nestane), tak použití Z-bufferu nepomůže, protože by se některé potenciálně viditelné části nemusely vykreslit (neprojdou Z-testem). Proto je potřeba objekty ručně setřídit podle Z-ové souřadnice a vykreslovat je v pořadí nejvzdálenější - nejbližší. Třídění samozřejmě zdržuje, což byl jeden z důvodů zavedení Z-bufferu.
3. pokud vykreslujete průhledné i neprůhledné objekty, musí se použít kombinovaná technika: nejdříve se v libovolném pořadí vykreslí všechny neprůhledné objekty se zapnutým Z-bufferem. Potom se zakáže zápis do Z-bufferu, ale test Z-ové hloubky se ponechá zapnutý. A následně se vykreslí _setříděné_ průhledné objekty.
Možnosti 2 a 3 mají nevýhodu v tom, že pokud se některé objekty protínají, budou jejich části vykreleny špatně. V tom případě se buď dá použít polygon offset a objekty vykreslit 2x nebo se musí objekty rozdělit v místě protnutí, což je samozřejmě zase práce pro programátora.
V dalších dílech si tyto techniky probereme podrobněji.