Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: diluo en 09 de Noviembre de 2009, 05:08:14 PM

Título: Iluminación depende de angulo de cámara
Publicado por: diluo en 09 de Noviembre de 2009, 05:08:14 PM
Hola, tengo un problema con la iluminación en OpenGL, al girar la cámara cambia la iluminación de toda la escena.
La luz es direccional: incide con el mismo ángulo para todos los objetos, como si fuera el sol.




const GLfloat lightAmbient[] = {0.2, 0.2, 0.2, 1.0};
const GLfloat lightDiffuse[] = {1.0, 0.6, 0.0, 1.0};
const GLfloat matAmbient[] = {0.6, 0.6, 0.6, 1.0};
const GLfloat matDiffuse[] = {1.0, 1.0, 1.0, 1.0};
const GLfloat matSpecular[] = {1.0, 1.0, 1.0, 1.0};
const GLfloat lightPosition[] = {0.0, 0.0, 1.0, 0.0};
const GLfloat lightShininess = 100.0;

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, lightShininess);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);



El problema es que al girar la cámara va cambiando la iluminación de todo, inexplicablemente.
He probado a decirle la posición a cada frame tras indicarle a opengl cual es la matriz de la cámara, pero sigue pasando:


glMatrixMode(GL_MODELVIEW);


//float mat[4*4]={ -CamMatrix->iM[0],  -CamMatrix->iM[1], -CamMatrix->iM[2], -CamMatrix->iM[3],
//     -CamMatrix->iM[4],  -CamMatrix->iM[5], -CamMatrix->iM[6], -CamMatrix->iM[7],
//       CamMatrix->iM[8],  CamMatrix->iM[9], CamMatrix->iM[10], CamMatrix->iM[11],
//                           0, 0, 0, -1  };


float mat[4*4]={ CamMatrix->iM[0], CamMatrix->iM[4], -CamMatrix->iM[ 8], 0,
CamMatrix->iM[1], CamMatrix->iM[5], -CamMatrix->iM[ 9], 0,
CamMatrix->iM[2], CamMatrix->iM[6], -CamMatrix->iM[10], 0,
                         CamMatrix->iM[3], CamMatrix->iM[7], -CamMatrix->iM[11], 1  };


glLoadMatrixf( mat );
glPushMatrix();

//glLoadIdentity(); glPushMatrix();
float lightPosition[] = {0.0f, 2.0f, 1.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);


Muchas gracias por vuestra atención.
Título: Re: Iluminación depende de angulo de cámara
Publicado por: tamat en 09 de Noviembre de 2009, 10:19:18 PM
la luz especular es una luz que se ve afectada por la posicion de la camara, prueba a desactivarla y ver si sucede lo mismo.
Por otra parte, no entiendo muy bien esa matriz modelview que usas, pero supongo que eso lo tienes bien.
Título: Re: Iluminación depende de angulo de cámara
Publicado por: diluo en 10 de Noviembre de 2009, 12:25:09 AM
Cita de: tamat en 09 de Noviembre de 2009, 10:19:18 PM
la luz especular es una luz que se ve afectada por la posicion de la camara, prueba a desactivarla y ver si sucede lo mismo.
Por otra parte, no entiendo muy bien esa matriz modelview que usas, pero supongo que eso lo tienes bien.


Hola tamat, gracias por tu ayuda. He dejado solo la luz lightAmbient y sigue pasando.


En mi motor cambio la modelview matrix para cada objeto 3D:


//---Generate rotate matrix for OpenGl.
//---Final matrix is CamMatrix *ObjectMatrix
float mat[4*4]={ FinalMatrix->iM[0], FinalMatrix->iM[4], -FinalMatrix->iM[ 8], 0,
FinalMatrix->iM[1], FinalMatrix->iM[5], -FinalMatrix->iM[ 9], 0,
FinalMatrix->iM[2], FinalMatrix->iM[6], -FinalMatrix->iM[10], 0,
FinalMatrix->iM[3], FinalMatrix->iM[7], -FinalMatrix->iM[11], 1 };

glLoadMatrixf( mat );

.
.
.

glDrawElements( GL_TRIANGLES, iGlTriCount, GL_UNSIGNED_SHORT, iGlTris );



No le digo a opengl cual es la matriz de cámara, solo uso la matriz de camara para generar FinalMatrix.
No uso glLookAt, no está disponible en el iphone.

Lo que es el motor 3D, funcionar funciona: www.mobilegamespro.com/defendlondon  ahora le estoy pasando al iphone.


Título: Re: Iluminación depende de angulo de cámara
Publicado por: tamat en 10 de Noviembre de 2009, 10:28:51 AM
Pero una pregunta, si usas iphone entonces no tienes fixed pipeline, si no tienes fixed pipeline cómo es que usas la iluminación de la fixed pipeline? No sería más facil hacerte tu propio shader? así controlas mejor los parametros.

No estoy seguro, de hecho recurdo que me pasó algo así hace tiempo, pero me atrevería a decir que tu problema es que tienes la posición de la luz en un sistema de coordenadas diferente (que no se multiplica por la modelview), de ahí que al moverse la camara cambie.

Por otra parte deberias dejar solo la diffusa, la ambiente en teoria no se ve afectada por nada.
Título: Re: Iluminación depende de angulo de cámara
Publicado por: diluo en 10 de Noviembre de 2009, 12:45:34 PM
Nada, he intentado de todo y no hay manera, dejaré el juego sin luces.
Ya para la siguiente versión, si la hago, usaré shaders.

Gracias por todo.
Título: Re: Iluminación depende de angulo de cámara
Publicado por: tamat en 10 de Noviembre de 2009, 01:10:48 PM
Insisto en que deberias programarte tu propio shader. mirate los tutoriales de lighthouse3d
Título: Re: Iluminación depende de angulo de cámara
Publicado por: Eskema en 11 de Noviembre de 2009, 03:05:11 AM
Cita de: diluo en 10 de Noviembre de 2009, 12:25:09 AM

No uso glLookAt, no está disponible en el iphone.


Yo uso glLookat, la conversion a iphone fue muy sencilla, la encontraras en muchas webs, respecto a la luz yo aun no he llegado a ese menester asi que no puedo ayudarte en eso ;)