PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stencil Shadow Volumes


del_4901
2006-06-04, 15:48:15
Ich hab hier diese lustigen Artefakte ... wiso??
Das erste Licht was ich zeichne sieht immer wunderbar aus.
(Sprich wenn ich die Schleife drehe ist es das andere Licht.)
Wenn ich 3 Lichter einbau ist auch nur das erste Ok.

Man man man ich hab mir schon den Kopp zerbrochen woran das liegen könnte ... ich versteh es nicht ... der StencilBuffer wird doch gecleared.
Und einzeln sieht alles toll aus. Die Objekte sind auch geschossen. Und das darkCap wird auch nicht geclippt ... DamIt


glPushAttrib(GL_ALL_ATTRIB_BITS);

//Z-1st PASS
//glBlendFunc(GL_ONE, GL_ZERO); glEnable(GL_BLEND);
glDepthMask(0xFF); glDepthFunc(GL_LEQUAL); glColorMask(0,0,0,0); glEnable(GL_CULL_FACE);
objectlist.draw();
allobjects[0].draw(); //plane

//PREPARE 2sided STENCIL TEST
glBlendFunc(GL_SRC_COLOR, GL_ONE); glEnable(GL_BLEND);
glDepthMask(0x00);
glEnable(GL_STENCIL_TEST);
glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
glEnable(GL_DEPTH_CLAMP_NV);
for(int i= 1; i>-1; i--)
{
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFunc(GL_ALWAYS, 0, ~0);
glDisable(GL_LIGHTING); glDisable(GL_BLEND);
glDepthFunc(GL_LESS); glDisable(GL_CULL_FACE); glColorMask(0,0,0,0);
glStencilMask(~0);


//Carmacks reverse (Z-fail)
glActiveStencilFaceEXT(GL_BACK); glStencilOp(GL_KEEP, GL_DECR_WRAP_EXT, GL_KEEP);
glActiveStencilFaceEXT(GL_FRONT); glStencilOp(GL_KEEP, GL_INCR_WRAP_EXT, GL_KEEP);
//Z-pass
//glActiveStencilFaceEXT(GL_FRONT); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR_WRAP_EXT);
//glActiveStencilFaceEXT(GL_BACK); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR_WRAP_EXT);

//DRAW STENCIL VOLUMES
shader->bind();
shader->setlight(i);
objectlist.draw();
shader->unbind();

//Draw Scene
glEnable(GL_LIGHTING); glEnable(GL_BLEND);
glDepthFunc(GL_EQUAL); glEnable(GL_CULL_FACE); glColorMask(1,1,1,1);
glStencilFunc(GL_EQUAL, 0, ~0);
glActiveStencilFaceEXT(GL_FRONT); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glActiveStencilFaceEXT(GL_BACK); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

objectlist.draw();
allobjects[0].draw(); //plane
dynamic_cast<light*>(lightobjects[i].frag)->draw();
}
//DRAW LAST VOLUME
glDisable(GL_CULL_FACE);
glStencilFunc(GL_ALWAYS, 0, ~0);
glDepthFunc(GL_ALWAYS);
shader->bind();
objectlist.draw();
shader->unbind();//*/


glPopAttrib();


VertexShader

uniform int i;

void main(void)
{
vec4 outvec = gl_ModelViewMatrix * gl_Vertex; //PoSITION
vec4 infvec = gl_ModelViewMatrix * vec4(gl_Vertex.xyz, 0.0); //PoSITION@Infinity
vec3 normal = gl_NormalMatrix * gl_Normal; //NoRMAL@MVM

vec4 LVdir = normalize(outvec * gl_LightSource[i].position.w - gl_LightSource[i].position); //Light direction
float LVdot = dot(-LVdir.xyz, normal.xyz); //Front or Backface (Light)

if(LVdot < 0.0)
{
//extrude Backfaces @ Infinity
outvec = infvec;
outvec = vec4((outvec.xyz) + 50.0*LVdir.xyz, outvec.w);
}
else
{
//Move FrontFaces slightly into the Object
outvec = vec4(outvec.xyz - normal.xyz * 0.02, outvec.w);
}
gl_Position = gl_ProjectionMatrix * outvec;
}

del_4901
2006-06-05, 19:37:56
Und da kann mir keiner von den Freaks sagen das ich
glActiveStencilFaceEXT(GL_FRONT); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glActiveStencilFaceEXT(GL_BACK); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
zu drehen habe? ^^

Kabelsalat
2006-06-05, 19:52:21
Mich würde mal interessieren, was bei dem Screenshot jetzt eigentlich falsch war (merwürdig sieht er sowieso aus^^). Vielleicht kannst du zum Vergleich auch noch einen korrekten Screenshot posten...?

del_4901
2006-06-05, 19:58:14
Kabelsalat[/POST]']Mich würde mal interessieren, was bei dem Screenshot jetzt eigentlich falsch war (merwürdig sieht er sowieso aus^^). Vielleicht kannst du zum Vergleich auch noch einen korrekten Screenshot posten...?
Das blaue ist das Volume. Das Rot umkreiste sollte nicht sein ... sprich Schatten wo keiner sein sollte.

Naja das Compostiting lässt noch zu wünschen übrig, aber das ist nichts was man nicht hinbekommen würde. (Die BodenTextur ist übrigens absichtlich so noisig ... Da hab ich frei nach Schnautze die Perlin-Noise Fkt. eingestellt.)

Kabelsalat
2006-06-05, 22:12:20
Aha... darf man fragen, was das Gesamtwerk geben wird? Demo? Game?

del_4901
2006-06-05, 22:15:32
Kabelsalat[/POST]']Aha... darf man fragen, was das Gesamtwerk geben wird? Demo? Game?
Ach im Moment ist immernoch der Weg das Ziel Es soll mehr in Richtung Game gehen. Um genau zu sein in Richtung Babylon5.