.[ ČeskéHry.cz ].
OpenGL - Vrstvy, Depth buffer a chyby při 2d otho

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 3. prosinec 2009, 06:09:26    Předmět: OpenGL - Vrstvy, Depth buffer a chyby při 2d otho Odpovědět s citátem

Zdravím ve spolek Wink

Nevím jestli jsem titulek topiku zvolil správně, proto malé intro:

Snažím se implementovat vykreslování texturovaných obdelníků ve vrstvách, z počátku jsem to udělal tak že jsem si vytvořil třídu Layer, která mi reprezentuje tu vrtsvu do které chci vykreslovat, takže jsem vytvořil několik instancí této třídy v třídě Renderer, a při vykreslování té textůry si zvolím nejprve aktivní vrstvu pomocí Renderer::setActiveLayer() a když pak zavolám Renderer::renderTexture() tak se pošlou ty parametry funkce to té aktivní instance třídy Layer, která si je uloží.

Před dokončením hlavní renderovací smyčky zavolám funkci Renderer::renderLayers() která všechno vykreslí.

Vše funguje, problém je v tom že ty informace o renderování zabírají docela dost paměti, mám kolem 8 vrstev, kde každá má svou pod a nad vrstvu (underlay & overlay).

No a zvolil jsem tento systém kvůli toho že jsem si myslel že tím vykreslování půjde optimalizovat, například instancing-em, jenže se ukázalo že je to spíše pomalejší než rychlejší.

--
Proto jsem se rozhodnul přejít na depth buffer, úprava byla rychlá, no jenže jsem narazil na chybu, vykreslují se mi i části textůr které původně nejsou vidět (mají alpha == 0).

Pro představu obrázek:
[img=http://img121.imageshack.us/img121/9601/depth.th.png]

Jsou to ty bílé části, v originále mají alpha == 0, a k tomu jsou černé.


Takhle nastavuji kontext před vykreslováním:

kód:

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            glEnable(GL_TEXTURE_2D);

            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

            //glEnable(GL_SCISSOR_TEST);
            //glScissor(0, 0, screenWidth, screenHeight);

            glEnable(GL_DEPTH_TEST);
            glDepthFunc(GL_LEQUAL);
            glClearDepth(10.0f);

            glViewport(0, 0, screenWidth, screenHeight);
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(0.0f, screenWidth, screenHeight, 0.0f, 0.0f, -10.0f);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            glTranslatef(0.375, 0.375, 0.0);


Věděl by někdo poradit? Děkuji za případné odpovědi.

PS: Doufám že v tom bude nějaké trapná chyba Laughing
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 3. prosinec 2009, 10:56:33    Předmět: Odpovědět s citátem

Průhledné objekty musí být kreslené až po nepruhledných, odzadu a s vypnutým zápisem do zbufferu.

Pokud je to pro tebe moc velká komplikace, tak místo blendingu používej alpha test. (nebo si zapni multisampling a použij alpha-to-coverage)
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna