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;
}
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;
}