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...
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.
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!
Aihe on jo aika vanha, joten et voi enää vastata siihen.