Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java - OpenGL: Stencil varjot

johku90 [04.05.2011 18:24:17]

#

Terve!

Olen tässä värkkäillyt tuollaista kirjastoa, joka pystyisi piirtämään 3d-malleja varjoineen. Kaikki toimii jotenkuten hyvin, mutta varjot eivät toimi silloin, kun kamera on varjon sisällä.

Ohjelma piirtää seuraavasti:

gl.glEnable(GL2.GL_STENCIL_TEST);
		gl.glStencilFunc(GL.GL_ALWAYS, 0, 0xffffffff);
		gl.glFrontFace(GL.GL_CCW);

		//	Täytetään stencilpuskuri nollilla ja piirretään 3d-malli valaistuksineen
		gl.glStencilOp(GL.GL_REPLACE, GL.GL_REPLACE, GL.GL_REPLACE);
		model.drawFaces(gl);

		//	Seuraavaksi käydään läpi stencil shadow volume algoritmi
		gl.glDisable(GL2.GL_LIGHTING);
		gl.glDepthMask(false);
	    gl.glColorMask(false, false, false, false);
	    gl.glStencilFunc(GL.GL_ALWAYS, 0, 0xffffffff);
	    gl.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_INCR);

	    //	piirretään vain etuosa varjoista ja lisätään stencilpuskurin arvoja

		model.drawShadows(gl, lightPos, false);	//	piirtää 3d-mallin varjot

		//	piirretään vain takaosa varjoista ja vähennetään stencilpuskurin arvoja
		gl.glFrontFace(GL2.GL_CW);
		gl.glStencilOp(GL2.GL_KEEP, GL2.GL_KEEP, GL2.GL_DECR);

		model.drawShadows(gl, lightPos, false);

		//	piirretään varjo niihin kohtiin, missä stencilpuskurin arvo ei ole 0
		gl.glFrontFace(GL2.GL_CCW);
		gl.glColorMask(true, true, true, true);
		gl.glStencilOp(GL2.GL_KEEP, GL2.GL_KEEP, GL2.GL_KEEP);
		gl.glStencilFunc(GL2.GL_NOTEQUAL, 0, 0xffffffff);

		gl.glEnable(GL.GL_BLEND);
        gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
        gl.glDisable(GL2.GL_DEPTH_TEST);

		gl.glLoadIdentity();
		gl.glTranslatef(0, 0, -1);
		DrawMethods.plane(gl, 2, 2, new float[]{0,0,0,0.8f}); // piirtää näytön kokoisen "varjolevyn"

		gl.glDisable(GL2.GL_STENCIL_TEST);
		gl.glEnable(GL2.GL_LIGHTING);
		gl.glEnable(GL2.GL_DEPTH_TEST);
		gl.glDepthMask(true);

Onkohan ongelma siinä, minkälainen tuo 3d-mallin shadow volume on? Siinä ei esim. ole suljettu varjon päitä kuin toiselta puolelta...

Metabolix [04.05.2011 18:50:15]

#

Ymmärrätkö, mihin algoritmi perustuu? Jos et, ota selvää. Ongelman syy on ilmeinen: kun kamera on varjon sisällä, kamera ei näe miltään suunnalta varjon "etuosaa" eli ulkopintaa vaan pelkän "takaosan" eli sisäpinnan.

Pikaisesti ajateltuna ongelman pitäisi ratketa, jos lasket ensin itse, onko kamera varjon sisällä, ja annat glStencilFunc-funktiolle nollan sijaan luvun -N, missä N on niiden objektien määrä, joiden varjon sisällä ollaan jo valmiiksi.

johku90 [09.05.2011 17:14:25]

#

Metabolix kirjoitti:

Ymmärrätkö, mihin algoritmi perustuu? Jos et, ota selvää. Ongelman syy on ilmeinen: kun kamera on varjon sisällä, kamera ei näe miltään suunnalta varjon "etuosaa" eli ulkopintaa vaan pelkän "takaosan" eli sisäpinnan.

Olet oikeassa. Syy on ilmeinen, mutta ratkaisu ei. Pikainen ajattelusi tuotti kuitenkin toimivalta tuntuvan ratkaisun. Kokeilen heti, kunhan olen keksinyt, miten lasken monenko varjon sisällä kamera on. Kiitoksia!

Vastaus

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

Tietoa sivustosta