Terve,
Olen tässä taas koittanut tehdä varjoja stencil-bufferin avulla.
Minua ihmetyttää, että mitä mahtaa tarkoittaa tuo kolmas parametri tuossa glStencilFunc-funktiossa. Dokumentaatiostakin yritin lukea, mutten oikein älynnyt.
"Specifies a mask that is ANDed with both the reference value and the stored stencil value when the test is done. The initial value is all 1's."
Eli jos laitan sen ykköseksi, sillä ei pitäisi olla mitään merkitystä. Näin minä sen ymmärtäisin. Kuitenkaan en saanut varjohommaa toimimaan, jos asetin sen ykköseksi. Sen sijaan esim. numerolla 7 kaikki toimi moitteettomasti???
Olen lukenut stencil-taulukon monesti läpi, ja minusta siellä on kyllä ihan oikeat arvot, ettei tämä siitä voi olla kiinni...
Tässä koodi, millä minä piirrän varjot:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glLoadIdentity(); gluLookAt(camx, camy, camz, camx+cos(lookR), camy+sin(lookR), camz-0.4, 0, 0, 1); glEnable(GL_STENCIL_TEST); glEnable(GL_DEPTH_TEST); glStencilFunc(GL_ALWAYS, 10, 7); //Numerolla seitsämän kaikki siis toimii hyvin glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); scene.draw(); // piirretään maailma, ja täytetään stencil-taulukko glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glColorMask(false, false, false, false); glDepthMask(false); glStencilOp(GL_KEEP, GL_INCR, GL_KEEP); glFrontFace(GL_CW); scene.drawShadow(lightDir, true); //piirretään varjojen etupuoli glStencilOp(GL_KEEP, GL_DECR, GL_KEEP); glFrontFace(GL_CCW); scene.drawShadow(lightDir, true); //ja toinen puoli glDisable(GL_CULL_FACE); glLoadIdentity(); glStencilFunc(GL_NOTEQUAL, 10, 7); //taas tämä kummallinen seiska glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(true, true, true, true); drawShadowMask(); // piirretään varjo sinne, missä stencil ei ole 10 glDepthMask(true); glDisable(GL_STENCIL_TEST);
Ja vielä kuvia:
Tässä käytin stencilFuncin kolmantena parametrina seiskaa:
http://hatfuls.net/projektit/cplusplus/varjot1.
Ja tässä ykköstä:
http://hatfuls.net/projektit/cplusplus/varjot2.
Mistä mahtaa olla kyse??
Edit: tuossa pallossa ei siis ole tarkoituskaan olla vielä varjoa..
johku90 kirjoitti:
Eli jos laitan sen ykköseksi, sillä ei pitäisi olla mitään merkitystä. Näin minä sen ymmärtäisin.
Lainaamasi kohta funktion kuvauksesta sanoo selvästi "all 1's", siis kaikki bitit ykkösiä, siis 32-bittisenä 0xffffffffu tai geneerisemmin ~0u. Kuten tuossa lukee, maski yhdistetään AND-operaatiolla kumpaankin arvoon ennen vertailua. Dokumentaatiossa on myös ensimmäistä parametria selittävissä kohdissa kaavat, joista toiminta näkyy.
Dokumentaatio kirjoitti:
GL_LESS: Passes if ( ref & mask ) < ( stencil & mask ).
Jos bittioperaatiot eivät ole tuttuja, on korkea aika opetella ne.
Metabolix kirjoitti:
Lainaamasi kohta kuvauksesta sanoo selvästi "all 1's", siis kaikki bitit ykkösiä, siis 32-bittisenä 0xffffffff tai geneerisemmin ~0u. Kuten tuossa lukee, maski yhdistetään AND-operaatiolla kumpaankin arvoon ennen vertailua. Dokumentaatiossa on myös ensimmäistä parametria selittävissä kohdissa kaavat, joista toiminta näkyy.
No näinhän se näyttäisi toimivan, kiitos!
Pitänee siis ruveta bittioperaatioita opiskelemaan :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.