[PC] Problema con OpenGL y las sombras

Hola, estoy empezando a programar (o al menos intentarlo) un juego en OpenGL para PC.
Estoy intentando implementar sombras realistas pero no consigo hacerlas aparecer.... quiza el procedimiento que sigo no sea adecuado y por eso necesito ayuda.
El casting de caras afectadas por la luz lo hago y es relativamente acertado, asi komo crear la silueta a proyectar, y su proyeccion hacia un infinito cercano... creo ke el problema lo tengo a la hora de usar el stencil buffer...
Este es el codigo del casting de caras afectadas por la luz, marcar las aristas de silueta e intentar proyectar la sombra...

[PHP]


void MODEL::CastShadow(float *LightPos)
{
//Rotacion necesaria por la posicion inicial del modelo que cargo...
glRotatef(-90.0, 1.0, 0.0, 0.0);
glRotatef(-90.0, 0.0, 0.0, 1.0);

//Calculo caras afectadas por la luz
for(unsigned i=0; i { // Posicion de lus enfrente de plano?
if(PtrFaces[i].Plane.IsInFrontPlane(VECTOR3D(LightPos[0], LightPos[1], LightPos[2])))
PtrFaces[i].Visible=true;
else
PtrFaces[i].Visible=false;
}

//Busco aristas para formar la silueta de la sombra
for(unsigned i=0; i {
//La cara no se ve afectada por la luz?
if(!PtrFaces[i].Visible)
{ //No tiene bordes de silueta
for(unsigned j=0; i<3; i++)
PtrFaces[i].SilhouetteEdge[j]=false;

continue;
};

for(unsigned j=0; j<3; j++)
{ //Cara afectada por la luz y sin cara vecina o la cara vecina no afectada por la luz?
if(PtrFaces[i].NeighbourIndices[j]==-1 || !PtrFaces[PtrFaces[i].NeighbourIndices[j]].Visible)
PtrFaces[i].SilhouetteEdge[j]=true;
else
PtrFaces[i].SilhouetteEdge[j]=false;
};
};


glDisable(GL_TEXTURE_2D); //Desactivo texturas por prevencion
glDisable(GL_LIGHTING); //Desactivo iluminacion

glDepthMask(GL_FALSE);
glDepthFunc(GL_LEQUAL);

glEnable(GL_CULL_FACE); //Activo el cull facing
glCullFace(GL_BACK); //La cara trasera es la que no tiene que dibujarse ni operarse

glEnable(GL_STENCIL_TEST); //Activo stencil test
glColorMask(0, 0, 0, 0); //Mascara todo a falso
glStencilFunc(GL_ALWAYS, 1, 0xffffffff);

glFrontFace(GL_CCW); //Cara frontal en sentido contrario agujas de relo
glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); //Primer paso, decremento el valor del stencil operation

for(unsigned i=0; i { // Cara visible?
if(PtrFaces[i].Visible)
{
for(unsigned j=0; j<3; j++)
{ // Arista de silueta?
if(PtrFaces[i].SilhouetteEdge[j])
{ //Calculo la longitud del vector que pasa por la luz, el vertice y va a un infinito cercano(100 unidades)
VECTOR3D V1((PtrFaces[i].Verts[j].Position.GetX()-LightPos[0])*100,
(PtrFaces[i].Verts[j].Position.GetY()-LightPos[1])*100,
(PtrFaces[i].Verts[j].Position.GetZ()-LightPos[2])*100);

VECTOR3D V2((PtrFaces[i].Verts[(j+1)%3].Position.GetX()-LightPos[0])*100,
(PtrFaces[i].Verts[(j+1)%3].Position.GetY()-LightPos[1])*100,
(PtrFaces[i].Verts[(j+1)%3].Position.GetZ()-LightPos[2])*100);

//Dibujo los poligonos
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(PtrFaces[i].Verts[j].Position.GetX(),
PtrFaces[i].Verts[j].Position.GetY(),
PtrFaces[i].Verts[j].Position.GetZ());
glVertex3f(PtrFaces[i].Verts[j].Position.GetX()+V1.GetX(),
PtrFaces[i].Verts[j].Position.GetY()+V1.GetY(),
PtrFaces[i].Verts[j].Position.GetZ()+V1.GetZ());
glVertex3f(PtrFaces[i].Verts[(j+1)%3].Position.GetX(),
PtrFaces[i].Verts[(j+1)%3].Position.GetY(),
PtrFaces[i].Verts[(j+1)%3].Position.GetZ());
glVertex3f(PtrFaces[i].Verts[(j+1)%3].Position.GetX()+V1.GetX(),
PtrFaces[i].Verts[(j+1)%3].Position.GetY()+V1.GetY(),
PtrFaces[i].Verts[(j+1)%3].Position.GetZ()+V1.GetZ());
glEnd();
};
};
};
};


glFrontFace(GL_CW); //Cara frontal en sentido e agujas del reloj
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); //Segundo paso, incremento el valor del stencil operation

for(unsigned i=0; i { // Cara visible?
if(PtrFaces[i].Visible)
{
for(unsigned j=0; j<3; j++)
{ // Arista de silueta?
if(PtrFaces[i].SilhouetteEdge[j])
{ //Calculo la longitud del vector que pasa por la luz, el vertice y va a un infinito cercano
VECTOR3D V1((PtrFaces[i].Verts[j].Position.GetX()-LightPos[0])*100,
(PtrFaces[i].Verts[j].Position.GetY()-LightPos[1])*100,
(PtrFaces[i].Verts[j].Position.GetZ()-LightPos[2])*100);

VECTOR3D V2((PtrFaces[i].Verts[(j+1)%3].Position.GetX()-LightPos[0])*100,
(PtrFaces[i].Verts[(j+1)%3].Position.GetY()-LightPos[1])*100,
(PtrFaces[i].Verts[(j+1)%3].Position.GetZ()-LightPos[2])*100);

//Dibujo los poligonos
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(PtrFaces[i].Verts[j].Position.GetX(),
PtrFaces[i].Verts[j].Position.GetY(),
PtrFaces[i].Verts[j].Position.GetZ());
glVertex3f(PtrFaces[i].Verts[j].Position.GetX()+V1.GetX(),
PtrFaces[i].Verts[j].Position.GetY()+V1.GetY(),
PtrFaces[i].Verts[j].Position.GetZ()+V1.GetZ());
glVertex3f(PtrFaces[i].Verts[(j+1)%3].Position.GetX(),
PtrFaces[i].Verts[(j+1)%3].Position.GetY(),
PtrFaces[i].Verts[(j+1)%3].Position.GetZ());
glVertex3f(PtrFaces[i].Verts[(j+1)%3].Position.GetX()+V1.GetX(),
PtrFaces[i].Verts[(j+1)%3].Position.GetY()+V1.GetY(),
PtrFaces[i].Verts[(j+1)%3].Position.GetZ()+V1.GetZ());
glEnd();
};
};
};
};

glFrontFace(GL_CCW); //Cara frontal en sentido contrario a las agujas del reloj
glColorMask(1, 1, 1, 1);

glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

glDepthFunc(GL_LEQUAL);
glDepthMask(GL_TRUE);

glEnable(GL_LIGHTING);

glDisable(GL_STENCIL_TEST);

glShadeModel(GL_SMOOTH);
};


[/PHP]


Agradeceria cualquier tipo de ayuda, adjunto dos imagenes, una con el resultado que obtengo, es decir sin sombra ni nada... y otro en la ke pinto la proyeccion en rojo para comprovar si el casting de caras y la propia proyeccion es correcta respecto al foco de luz, representado por un circulito amarillo.
Gracias de antemano

Adjuntos

Esto pone en las normasl del foro...

FUNCIONAMIENTO DEL FORO (beta)

-------------
Estas son las normas de funcionamiento del foro, están abiertas a sugerencias por si véis conveniente cambiar algo antes de hacerlas "oficiales"
--------------

Este foro está dedicado al desarrollo de sofware casero (aplicaciones y juegos) para videoconsolas, así como cualquier otro desarrollo directamente relacionado con las videoconsolas. El desarrollo de aplicaciones generales para PC, aplicaciones web, etc. está excluido (hay muchos otros foros en la red dedicados a ello), no así los proyectos multiplataforma (XNA por ejemplo) o los programas cuya utilidad esté directamente relacionada con las videoconsolas (creación de parches por ejemplo).

creo que te equivocas a la hora de proyectar las sombras a mi me pasaba hace tiempo y lo solucioné. Mirate los tutoriales de nehe.
Muchas gracias por la informacion, siento haber posteado erroneamente.
Un saludo, y que cierren el hilo por favor... [toctoc]
2 respuestas