Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 3. prosinec 2009, 06:09:26 Předmět: OpenGL - Vrstvy, Depth buffer a chyby při 2d otho |
|
|
Zdravím ve spolek
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  |
|
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 3. prosinec 2009, 10:56:33 Předmět: |
|
|
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 |
|