HTML

gondolataim elsősorban játékfejlesztésről

Elsősorban játékfejlesztés magyarul: az enginem fejlesztése során felmerülő problémák, ötletek, tévutak stb dokumentálása, amely számomra és talán mások számára is hasznos lehet később Másodsorban gondolatok szavakban...

Kapcsolat:
aalberik 'at' gmail 'dot' com

Haletető

Galéria

Címkék

Összes

Linkblog

Naptár

április 2024
Hét Ked Sze Csü Pén Szo Vas
<<  < Archív
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Amikor egy menet nem elég...

2010.02.28. 20:13 :: syam

Sokáig nem gondoltam bele programozóként milyen is volt a 3D programozói világ gyorsítókártyák nélkül/kezdeti gyorsítókártyákkal. Mai szemmel nézve a különböző felületeken megjelenő effektek nem tűnnek bonyolultnak azonban a kezdetek kezdetén ez nem volt annyira egyszerű. Olyan effektekre gondoljunk, amely mellett/alatt még látszik az eredeti szín/diffúz textúra, mint pl. tükröződés, erőtér effekt, villám, decal stb. Gondoljunk bele ezekhez az effektekhez mire is van szükség: két vagy több különböző textúrára, amelyek ugyanazon felületen/modellen jelennek meg. Ennek megvalósítására két lehetőség kínálkozik: az ún. multitextúrázás ill. multipass rendering(többmenetes renderelés). A kezdetek kezdetén azonban még nem létezett az első megoldás így a második lehetőség jöhetett csak számításba. Azonban a multitextúrázás meglétének ellenére még ma is sokszor előfordul, hogy ugyanazon háromszögeket többször jelenítünk meg - ha nem elérhető elegendő textúrázó egység vagy egy különálló (és/vagy speciális) renderelési fázist igényel az adott effekt.

A megvalósítása az alábbiakat igényli.

  • Figyelnünk kell a rajzolási sorrendre ti. ez határozza meg a rétegek egymásra hatását.
  • Be kell kapcsolnunk a polygon offsetet. Erre az ellenkező esetben fellépő z-fight miatt van szükség. Ajánlott glPolygonOffset paraméterek: 0, -100...-600.
  • Ki kell kapcsolnunk a depth bufferbe írást vagyis glDepthMask (GL_FALSE). Erre szintén a z-fight ad okot.
  • Be kell kapcsolnunk az alpha testet és/vagy a blendet.
  • Amennyiben csak alpha testet engedélyezünk, akkor csak egymásra tudjuk a rétegeket maszkolni.
  • Blend esetén a két réteg egymással az elérhető blendelési funkciókkal kombinálható. Multitextúrázás emulálása esetén a GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, decal esetén GL_DST_COLOR, GL_SRC_COLOR a gyakori azonban bármilyen más kombináció is elképzelhető az elérni kívánt hatástól függően (lightmap réteg renderelése esetén GL_DST_COLOR, GL_ZERO kombináció gyakori).

A technika nagy hátránya, hogy

  • ahányszor (ahány réteget) renderelünk, annyiszor küldjük el a geometriát és annyiszor raszterizálunk vagyis csökkenti a teljesítményt- leggyakrabban fill rate területén érezteti a hatását
  • a rétegeket csak az elérhető blendelési funkciókkal tudjuk kombinálni

Megjegyzendő, hogy a hatás megbolondítható a glColorMask funkcióval vagyis ilyenkor bizonyos rétegek adott színcsatornát írhatnak felül.

Természetesen a multipass rendering kifejezést nem csak ilyen esetben használjuk. Gyakran előfordul, hogy egy renderelési fázis eredménye közvetlenül nem jelenik meg a színbufferben pl. offscreen renderelünk vagy stencil bufferbe.

 

Szólj hozzá!

Címkék: decal polygon offset z fight multipass rendering

A bejegyzés trackback címe:

https://sakura7.blog.hu/api/trackback/id/tr11798014

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása