Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Iluminación depende de angulo de cámara

Iniciado por diluo, 09 de Noviembre de 2009, 05:08:14 PM

« anterior - próximo »

diluo

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.

tamat

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.
Por un stratos menos tenso

diluo

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.



tamat

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.
Por un stratos menos tenso

diluo

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.

tamat

#5
Insisto en que deberias programarte tu propio shader. mirate los tutoriales de lighthouse3d
Por un stratos menos tenso

Eskema

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






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.