Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: glStencilFunc

johku90 [10.02.2012 00:33:56]

#

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.jpg

Ja tässä ykköstä:
http://hatfuls.net/projektit/cplusplus/varjot2.jpg

Mistä mahtaa olla kyse??

Edit: tuossa pallossa ei siis ole tarkoituskaan olla vielä varjoa..

Metabolix [10.02.2012 00:42:30]

#

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.

johku90 [10.02.2012 00:56:53]

#

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 :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta