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.