Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dudas con la iluminacion en opengl

Iniciado por luisdomarco, 23 de Junio de 2009, 12:04:59 PM

« anterior - próximo »

luisdomarco

 Hola.

Llevo unos meses con esto de Opengl y aunque no lo llevo mal todavía estoy entendiendo como funciona todo.

Ahora mismo estoy con las luces y tengo bastantes dudas.

He conseguido meter varias luces simultaneas y emular una especie de bombillas de colores que se mueven pero tengo varios problemas.

Las luces siempre apuntan hacia el centro. He intentado cambiar la dirección de la luz pero no lo consigo, era lo que quería en principio y parece ser que por defecto apuntan al centro, pero ahora no puedo cambiar la dirección.

He leído en algún tutoríal que las luces pueden convertirse en direcionales pero a mi me ocurre lo contrario, siempre son direccionales ¿Como puedo hacer para que iluminen en todas direcciones? He probado con distintos valores con glLightf(GL_LIGHTx,   GL_SPOT_CUTOFF,valor) pero lo único que consigo son errores en la iluminación.

También tengo problemas al usar glColor3f(). Cuando uso glColor3f(), por ejemplo para el texto, desactivo las iluminación y después vuelvo a activarla pero el color que haya usado en glColor3f() influye en la iluminación. Lo que hago después de usar glColor3f() es establecer el color a blanco, así es como consigo los mejores resultados pero el problema es que cuando cambio los valores de glLightf (GL_LIGHTx, GL_SHININESS,   valor) estes no tienen efecto si el color establecido con glColor3f() es blanco, con lo cual deduzco que algo no estoy haciendo bien ¿Es normal eso?

  En principio a ver si me podéis ayudar con esto, gracias de antemano.

Me gustaría enseñaros mis progresos ¿A donde puedo subir un ejecutable?


Añado el código de la función InitGl() por si olvido algo

GLfloat Model_Ambient[]={0.05f,0.05f,0.05f,1.0f};

GLfloat L0_Diffuse []={0.6f,0.0f,0.0f,1.0f}; //Luz roja
GLfloat L1_Diffuse []={0.0f,0.6f,0.0f,1.0f}; // Luz verde
GLfloat L2_Diffuse []={0.0f,0.0f,0.6f,1.0f}; // Luz azul

glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Model_Ambient) ;

glLightfv(GL_LIGHT0, GL_DIFFUSE, L0_Diffuse );
glLightfv(GL_LIGHT0, GL_SPECULAR,L0_Diffuse );
glLightf (GL_LIGHT0, GL_SHININESS, 50);

glLightfv(GL_LIGHT1, GL_DIFFUSE, L1_Diffuse );
glLightfv(GL_LIGHT1, GL_SPECULAR,L1_Diffuse );
glLightf (GL_LIGHT1, GL_SHININESS, 50);

glLightfv(GL_LIGHT2, GL_DIFFUSE, L2_Diffuse );
glLightfv(GL_LIGHT2, GL_SPECULAR,L2_Diffuse );
glLightf (GL_LIGHT2, GL_SHININESS, 50);

return TRUE;


y la fución donde créo la escena

int Escena1(GLvoid)
{

GLenum tm=TIMER_GetScnTime();


if (escena1)
{
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);
glDisable(GL_LIGHT2);
       // en el main() cambia el valor de nluces al pulsar espacio.
if (nluces & 1)
{
glEnable(GL_LIGHT0);
}
if (nluces & 2)
{
glEnable(GL_LIGHT1);
}
if (nluces & 4)
{
glEnable(GL_LIGHT2);
}

escena1=false;
}
camarapos[0]=GLfloat(cos((tm) *0.0004f)*15.0f);
camarapos[1]=GLfloat(cos((tm) *0.0004f)*5.0f);
camarapos[2]=GLfloat(sin((tm) *0.0005f)*15.0f);
NormalizarVector (camarapos,camaranormal);

luzrpos[0]=GLfloat(cos(tm *0.0005f)*6.0f);
luzrpos[1]=GLfloat(sin(tm *0.0006f)*4.0f);
luzrpos[2]=GLfloat(cos(tm *0.00065f)*6.0f);
NormalizarVector (luzrpos,luzrnormal);

luzgpos[0]=GLfloat(cos(tm *-0.00065f)*7.0f);
luzgpos[1]=GLfloat(cos(tm *0.0005f)*4.5f);
luzgpos[2]=GLfloat(sin(tm *0.0005f)*7.0f);
NormalizarVector (luzgpos,luzgnormal);

luzbpos[0]=GLfloat(cos(tm *0.0006f)*8.0f);
luzbpos[1]=GLfloat(sin(tm *-0.0005f)*5.0f);
luzbpos[2]=GLfloat(sin(tm *-0.00065f)*8.0f);
NormalizarVector (luzbpos,luzbnormal);

camara.posx=camaranormal[0]*9+camarapos[0];
camara.posy=camaranormal[1]*4+camarapos[1];
camara.posz=camaranormal[2]*9+camarapos[2];

camara.calcular(); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();


glRotatef(camara.rotx,1.0f,0,0);
glRotatef(360-camara.roty,0,1.0f,0.0f);
glTranslatef(-camara.posx, -camara.posy, -camara.posz );


glLightfv(GL_LIGHT0,GL_POSITION, luzrpos); // Luz 0 , luz roja
glLightfv(GL_LIGHT1,GL_POSITION, luzgpos); // Luz 1 , luz verde
glLightfv(GL_LIGHT2,GL_POSITION, luzbpos); // Luz 1 , luz azul

        glCallList(list); // dibujamos escena

glDisable(GL_LIGHTING);         //desastivamos luz para dibujar luces de color puro, sin efectos de luz

if (nluces & 1)
{
glPushMatrix();
glTranslatef(luzrpos[0],luzrpos[1],luzrpos[2]);    // dibujamos luz roja
glColor3f(0.1f,0.0f,0.0f);
glCallList(list+2);                                                   
glColor3f(1.0f,0.0f,0.0f);
glTranslatef(luzrnormal[0]*-0.2f, luzrnormal[1]*-0.2f,luzrnormal[2]*-0.2f );
glCallList(list+1);
glPopMatrix();
}
if (nluces & 2)
{
glPushMatrix();
glTranslatef(luzgpos[0],luzgpos[1],luzgpos[2]);    // dibujamos luz roja
glColor3f(0.0f,0.1f,0.0f);
glCallList(list+4);
glColor3f(0.0f,1.0f,0.0f);
glTranslatef(luzgnormal[0]*-0.2f, luzgnormal[1]*-0.2f,luzgnormal[2]*-0.2f );
glCallList(list+3);
glPopMatrix();
}
if (nluces & 4)
{
glPushMatrix();
glTranslatef(luzbpos[0],luzbpos[1],luzbpos[2]);    // dibujamos luz roja
glColor3f(0.0f,0.0f,0.1f);
glCallList(list+6);
glColor3f(0.0f,0.0f,1.0f);
glTranslatef(luzbnormal[0]*-0.2f, luzbnormal[1]*-0.2f,luzbnormal[2]*-0.2f );
glCallList(list+5);
glPopMatrix();
}

glColor3fv(objeto3d.color3f);

glPopMatrix();

glFlush();
frame++;

        return TRUE;
}


Cualquier consejo sobre el código será bien recibido, mis conocimientos de C son muy básicos.

Voy a colgar unas imágenes para ilustrar lo que he hecho.

Un saludo.








Edito, he cambiado unas líneas que no estaban muy profesionales, no recordaba como se hacían operaciones lógicas  :-[, llevo años sin programar.




tamat

puff, iluminacion por fixed pipeline, ya casi no lo recuerdo (y te recomendaria que cuando antes te pases a shaders mejor).

Aun así de lo poco que te puedo decir es que mires el tema de los materiales, no solo de las propiedades de la luz, y no olvides que el cuarto parametro de la posicion de un foco determina si es direccional (desde el infinito) o es omni.

Siento no poder ayudarte más pero actualmente la gente se programa su propio shader de iluminacion para evitar todo lo engorroso de trabajar con todos esos parametros de opengl.
Por un stratos menos tenso

Prompt

#2
Cita de: luisdomarco en 23 de Junio de 2009, 12:04:59 PM
Las luces siempre apuntan hacia el centro. He intentado cambiar la dirección de la luz pero no lo consigo, era lo que quería en principio y parece ser que por defecto apuntan al centro, pero ahora no puedo cambiar la dirección.

He leído en algún tutoríal que las luces pueden convertirse en direcionales pero a mi me ocurre lo contrario, siempre son direccionales ¿Como puedo hacer para que iluminen en todas direcciones? He probado con distintos valores con glLightf(GL_LIGHTx,   GL_SPOT_CUTOFF,valor) pero lo único que consigo son errores en la iluminación.

También tengo problemas al usar glColor3f(). Cuando uso glColor3f(), por ejemplo para el texto, desactivo las iluminación y después vuelvo a activarla pero el color que haya usado en glColor3f() influye en la iluminación. Lo que hago después de usar glColor3f() es establecer el color a blanco, así es como consigo los mejores resultados pero el problema es que cuando cambio los valores de glLightf (GL_LIGHTx, GL_SHININESS,   valor) estes no tienen efecto si el color establecido con glColor3f() es blanco, con lo cual deduzco que algo no estoy haciendo bien ¿Es normal eso?

  En principio a ver si me podéis ayudar con esto, gracias de antemano.

Me gustaría enseñaros mis progresos ¿A donde puedo subir un ejecutable?

Estas mezclando conceptos a tutti plen!  ::)

Veamos para ver como funciona el fixed pipeline de OGL 1º hay que entender que existe 1 o varios contexto de renderizado. Normalmente solo 1.

Dentro de este contexto (no te preocupes por el) pintas cosas de modo directo, direct rendering / forward redering por fixed pipelines.
Por ejemplo cuando usas shaders tiempre tienes un begin y un end para saber hasta donde afecta lo que haces. En fixed pipelines existe algo similar, del que no te hablaré para que la performance de tu app no se vaya al traste. Pero piensa que es algo como glPushMatrix glPopMatrix.

Bueno piensa en el fixed pipeline como cosas que vas activando para pintar:

glClear...

glColor3f(BLANCO); // activamos el color blanco (piensa en que coges un pincel)
drawTorus();

drawTeapot(); // si no cambias de pincel sigues pintando en blanco...

swapBuffers();



Leyendo tu codigo, a bote pronto no veo tus luces direccionales por ningun lado en las imagenes canta mucho. Como dice tamat el parametro que te falta es el radio de accion de la luz. Actualmente y por defecto las luces son omnidireccionales.

Propiedades de una luz:


glLightfv(GL_LIGHT0 + lightId, GL_POSITION , rawPosition);
glLightfv(GL_LIGHT0 + lightId, GL_AMBIENT  , m_properties.ambient);
glLightfv(GL_LIGHT0 + lightId, GL_DIFFUSE  , m_properties.diffuse);
glLightfv(GL_LIGHT0 + lightId, GL_SPECULAR , m_properties.specular);

glLightfv(GL_LIGHT0 + lightId, GL_EMISSION , m_properties.emission);
glLightf (GL_LIGHT0 + lightId, GL_SHININESS, m_properties.shininess);

glLightfv(GL_LIGHT0 + lightId, GL_SPOT_DIRECTION       , m_properties.spotDirection);
glLighti (GL_LIGHT0 + lightId, GL_SPOT_EXPONENT        , m_properties.spotExponent);
glLightf (GL_LIGHT0 + lightId, GL_SPOT_CUTOFF          , m_properties.spotCutOff);
glLightf (GL_LIGHT0 + lightId, GL_CONSTANT_ATTENUATION , m_properties.constantAttenuation);
glLightf (GL_LIGHT0 + lightId, GL_LINEAR_ATTENUATION   , m_properties.linearAttenuation);
glLightf (GL_LIGHT0 + lightId, GL_QUADRATIC_ATTENUATION, m_properties.quadraticAttenuation);


Ahi está mi codigo para poner los estados de la luz. Deberias mirar el MSDN para saber que parametros por defecto tienen esos valores ya que si pones otro, puedes activar la luz direccional o un spot light.

Busca información sobre glFlush, glFlush cierra todo lo que en tu codigo no hayas cerrado. No te acostumbres, de hecho en un futuro esa función va a desaparecer ya que es un bottle neck potencial. No se si en OGL 3.5 la han quitado ya...

PD: debes dedicarle un tiempo a saber como formatear tu codigo, para que quede legible, cuadrado y ordenado. Es fundamental. Puede que leer el libro Code Complete te ayude.

Un saludo  ^_^

Prompt

Cita de: luisdomarco en 23 de Junio de 2009, 12:04:59 PM

Me gustaría enseñaros mis progresos ¿A donde puedo subir un ejecutable?


Rapidshare? megaupload?

En mi opinion hazte lo antes posible un capturador de frames -> texturas y usa virtualDub o mplayer para encodearlo a video. Subelo a youtube o vimeo. Nos servirá a todos mucho mejor para ayudarte o ver lo que haces.

luisdomarco

 Gracias a los dos por los consejos.

No conocía lo del cuarto parámetro de la posición de la luz, que raro que no lo haya visto en ningún tutorial, y si, algo cambia aunque no acabo de entender del todo lo que pasa. Si es 0 la cosa queda como estaba, es decir da la sensación de que las luces son direccionales y apuntan al centro, y si es 1 no se si convierte en omni o es que la luz es más intensa, además tengo la duda de que el cubo exterior se ilumine correctamente cuando es 1, con el valor 0 la iluminación me parece mas coherente, quizás sea sensación mía.
Por otro lado no consigo cambiar la dirección de la luz o quizás si y por la forma de iluminar lo objetos del centro da la sensación de que apunta hacia ellos aunque no sea así, no estoy seguro.

La verdad es que es un poco comedura de tarro.

Lo que me comentas, Prompt, sobre tener cuidado con lo que activo pues más o menos ya me estaba dando cuenta solo, pero mis cabreos me pille por no entender como funcionaba, ahora lo veo mas claro.

Lo de las propiedades de la luz y del material también tengo por ahí un tutorial, creo entenderlo pero es fácil que se escape algo, son demasiados parámetros de repente.

Quizás debería hacer caso a Tamat y ponerme con los shaders, pero me dan miedo ¿Algún sitio para empezar a leer algo sobre el tema?

De todas formas tened en cuenta que acabo de empezar, creo que hay muchas cosas antes de eso ¿no?   además necesito cambiar de tercio.

Un saludo y gracias a los dos de nuevo, me vereís por aqui de vez en cuando, esto engancha la ostia, lastima que no tenga más tiempo libre.


PD: ¿Como es eso del capturador de frames?
He probado algún programa para hacer un video como dices, pero mi programa bajaba o 15 fps, no había caído en capturar los frames.


Prompt

Yo llevaba años ya dandole al OpenGL cuando me hice con el libraco OpenGL SuperBiblia, está en castellano y aunque te mate ver cosas como "apuntador" se puede soportar :)

De hecho llega a los temas de shaders, aunque yo no me enteré poco! lo explica muy mal. Ahi ya te tienes que ir aqui http://www.typhoonlabs.com/ y leer los PDFs de nuestro amigote, que creo recordar que tienen alguna errata pequeña pero que son muy muy claros.

Estaba pensando en copiarte mi codigo de lectura del BACK BUFFER (luego con el haces un TGA por ej) pero mejor no. Deberias acostumbrarte a estar todo el santo dia leyendo y escudriñando google. Te diré que necesitarás la función glReadPixels y saber algo de pixel buffers o frame buffers(mejor)

Comprate el libro, repasa todo el fixed pipeline, pq te será necesario. Es una quimera estudiar ahora solamente shaders.

luisdomarco


Ufff   ???, lo he mirado por encima y de momento creo que voy a seguir con los tutoriales de NEHE  :-X que me resultan mas sencillos  de entender, aunque me lo apunto para más adelante. El libro  me parece muy buena idea, además me gusta tener determinadas cosas en papel.

Lo del capturador de frames si que lo intentaré por que los programas que he probado van muuuy lentos, gracias por la información.

Un saludo.

luisdomarco

 Pues me he puesto con lo de capturar una imagen.

He buscado información, he encontrado una función en un lado otra en otro ( creo entender las dos ) y  las he modificado para que funcionen con mi código. Justo antes de glClear();  guardo una imagen, arranco el programa y efectivamente se ha creado un TGA pero no sale como debería.




Las funciones que uso son estas.




bool WriteTga(const char*img_name, int sw, int sh, int bpp,unsigned char*buf)
{
char tga_name[1024];
FILE *tga;

strcpy(tga_name, img_name);
strcat(tga_name, ".tga");

tga = fopen(tga_name, "w");
if (!tga)
{
return false;
}

putc(0,tga);
putc(0,tga);
putc(2,tga);
putc(0,tga); putc( 0,tga); //maporg
putc(0,tga); putc( 0,tga); //maplen
putc(0,tga);
putc(0,tga); putc( 0,tga); // xorigin
putc(0,tga); putc( 0,tga); // yorigin
putc(sw,tga); putc( sw>>8,tga); // sw
putc(sh,tga); putc( sh>>8,tga); // sh
putc(32,tga);

putc( 0,tga); // flag 0x20 means: inverted image.

fwrite(buf,sw*sh*bpp,1,tga);

fclose(tga);
return true;
}

bool SaveScreen(const char* filename)
{
int sw = ANCHO;
int sh = ALTO;
int bpp = COLOR/8;
GLenum format = GL_RGBA ;
bool ret;

// Reservamos memoria para almacenar los datos de la imagen
unsigned char* pdata = new unsigned char[sw*sh*bpp];
//Leemos del buffer de la pantalla
glReadBuffer(GL_BACK);
//Leemos los pixeles que nos interesan
glReadPixels(0,0,ANCHO,ALTO,format,GL_UNSIGNED_BYTE,pdata);
//Guardamos los datos como un archivo tga
ret = WriteTga(filename,sw,sh,bpp,pdata);
//Liberamos memoria
delete [] pdata;
return ret;
}


  y simplemente antes de glClear();

if (frame==1)
{
SaveScreen("imagentga");
}









Prompt

Lo raro es que al principio de la imagen sale bien. Yo creo que la captura la haces bien, el problema está en el save, me suena mal ver: int bpp = COLOR/8; no se que valor tendrá.

Asegurate del valor que da bpp que deberia ser imagino 4 en el caso de RGBA, 4 canales.

luisdomarco

Y tan raro, como que se ha solucionado solo, y no he cambiando nada, después de probar cambiando valores a ver si sonaba la flauta lo deje por imposible pero al día siguiente ya funcionaba, no se.

Aunque no esta bien del todo, mi intercambia los bytes R por el B, lo he solucionado, es fácil con un bucle, aunque imagino que cambiando algún parámetro sería mas correcto.

También he engañado al timer para que el futuro video valla a la misma velocidad que en el ejecutable y también guardo cada frame numerado, es decir, frame0001.tga,frame0002 ..., etc. Total tengo 1000 frames para un video de 30 segundos  pero con todos los programas que he probado no veo opción a que cada imagen sea un frame y no supero la velocidad de 1frame/5 segundos  ??? ¿Algún método o programa para hacerlo de forma simple? El último que he probado es el adobe premier 6.0 y me extraña que no tenga esa opción, supuestamente es un buen programa de edición de video.


Prompt

Ahora que dices eso de R y B creo que el formato más comodo es ABGR o algo así, no es el tipico RGBA, para que la obtencion sea más rapida creo que se suele cambiar a ese formato más comodo.

Yo no lo hice, pero la idea es tener un hilo que hace el volcado a disco y el correspondiente cambio de formato al que más te guste para escribir una TGA. Eso hace que el impacto en rendimiento sea menor.

lemoniac

Un poco tarde, pero comento algo interesante (y básico): las coordenadas homogéneas.

Como en gráficos utilizamos matrices de 4x4 también necesitaremos vectores de 4 elementos para poder multiplicar (4x1 ó 1x4), de la forma (x, y, z, w)

Para verlo en 3d hay que proyectarlo dividiendo cada elemento por la w.

Así a groso modo:
- cuando w es igual a 0, el vector equivale a (x, y, z)
- cuando es 1, es lo mismo que el punto (x, y, z)
- cuando es distinto, equivale al punto (x/w, y/w, z/w)

Así que cuando pones una luz acabada en 0, estás haciendo una luz direcciona, y cuando es distinto, puntual.

luisdomarco

#12
Cita de: Prompt en 01 de Julio de 2009, 10:21:58 AM
Ahora que dices eso de R y B creo que el formato más comodo es ABGR o algo así, no es el tipico RGBA, para que la obtencion sea más rapida creo que se suele cambiar a ese formato más comodo.

Yo no lo hice, pero la idea es tener un hilo que hace el volcado a disco y el correspondiente cambio de formato al que más te guste para escribir una TGA. Eso hace que el impacto en rendimiento sea menor.

  Ya funciona bien, ejem, bueno se como haver que no funcione mal  :D.

El formato es GL_BGRA o GL_BGRA_EXT aunque a mi solo me reconoce el segundo sera por que no uso GLUT, no se.

Hay algun fallo que no entiendo pero se como evitarlo.

...

  Línea que no se entendía bien.

int bpp = COLOR/8;

En la funcion que modifique comprobaba los parametros de la ventana mediante funciones, pero a parte de que la funcion usaba GLUT tampoco necesitaba comprbarlo por que la ventana la creo yo y controlo esos parametros. En esa linea lo unico que hago es convertir los bits que le paso a la función CreteGLWindow() en bytes para reservar memoria.

El error si iba por ahí aunque lo solucione cambiando la configuracion de pantalla. Para que funcione tiene que estar la pantalla a 16 bits
y la ventana a 32, solo funciona bien así  :-X Oo.

El caso es que ya tengo el video hecho, al final con el virtualdub, es muy fácil pero no lo entendia, he vuelto a prbar y di con la tecla. En otro momento lo subo.


  Gracias a todos por la ayuda y los consejos.

Prompt

Ya te comenté:
CitarAsegurate del valor que da bpp que deberia ser imagino 4 en el caso de RGBA, 4 canales.

Y ahora solo te hace falta postear el código amablemente y marcar el post como [Solved] cambiandole el titulo :)
Quizás alguien mejore tu código el día de mañana ;)

luisdomarco

#14
  Lo que pretendía con la variable bbp es que si cambiaba el color de la ventana de opengl funcionara igualmente sin necesidad de modificar la función pero no, como he dicho antes solo funciona si configuro la pantalla con 16 bits de color y la ventan de opengl con 32 bits, es decir que solved lo que se dice solved no está aunque se puede apañar un video sabiendo esto  :D.

  Pero bueno, aunque todavía tengo dudas y no acabo de conseguir el efecto deseado (quizás sea mi método ) si he aprendido cosas sobre la iluminación y espero que las dudas que ahora tengo se vayan resolviendo con practica y pruebas. De moemnto doy el tema por zanjado.

Por si a alguien le puede servir de ayuda resumo lo que se ha dicho sobre el tema.

Cita de: Prompt en 25 de Junio de 2009, 05:06:16 PM
Propiedades de una luz:


glLightfv(GL_LIGHT0 + lightId, GL_POSITION , rawPosition);
glLightfv(GL_LIGHT0 + lightId, GL_AMBIENT  , m_properties.ambient);
glLightfv(GL_LIGHT0 + lightId, GL_DIFFUSE  , m_properties.diffuse);
glLightfv(GL_LIGHT0 + lightId, GL_SPECULAR , m_properties.specular);

glLightfv(GL_LIGHT0 + lightId, GL_EMISSION , m_properties.emission);
glLightf (GL_LIGHT0 + lightId, GL_SHININESS, m_properties.shininess);

glLightfv(GL_LIGHT0 + lightId, GL_SPOT_DIRECTION       , m_properties.spotDirection);
glLighti (GL_LIGHT0 + lightId, GL_SPOT_EXPONENT        , m_properties.spotExponent);
glLightf (GL_LIGHT0 + lightId, GL_SPOT_CUTOFF          , m_properties.spotCutOff);
glLightf (GL_LIGHT0 + lightId, GL_CONSTANT_ATTENUATION , m_properties.constantAttenuation);
glLightf (GL_LIGHT0 + lightId, GL_LINEAR_ATTENUATION   , m_properties.linearAttenuation);
glLightf (GL_LIGHT0 + lightId, GL_QUADRATIC_ATTENUATION, m_properties.quadraticAttenuation);


Ahi está mi codigo para poner los estados de la luz. Deberias mirar el MSDN para saber que parametros por defecto tienen esos valores ya que si pones otro, puedes activar la luz direccional o un spot light.


Creo que es muy importante esto que comenta lemoniac, recuerdo efectos rarísimos e incomprensibles con las luces y ahora entiendo que se debían a que pasaba como parametro a GL_SPOT_DIRECTION un vector de 3 elementos.


Cita de: lemoniac en 01 de Julio de 2009, 12:18:11 PM
Un poco tarde, pero comento algo interesante (y básico): las coordenadas homogéneas.

Como en gráficos utilizamos matrices de 4x4 también necesitaremos vectores de 4 elementos para poder multiplicar (4x1 ó 1x4), de la forma (x, y, z, w)

Para verlo en 3d hay que proyectarlo dividiendo cada elemento por la w.

Así a groso modo:
- cuando w es igual a 0, el vector equivale a (x, y, z)
- cuando es 1, es lo mismo que el punto (x, y, z)
- cuando es distinto, equivale al punto (x/w, y/w, z/w)

Así que cuando pones una luz acabada en 0, estás haciendo una luz direccional, y cuando es distinto, puntual.


Y estas son las funciones que he utilizado para capturar una imagen y asi montar un pequeño video con el virtualdub, recordad que solo funcionan bien si la ventana esta configurada a 32 bits y la pantalla a 16.


bool WriteTga(const char*img_name, int sw, int sh, int bpp,unsigned char*buf)
{
char tga_name[1024];
FILE *tga;

strcpy(tga_name, img_name);
strcat(tga_name, ".tga");

tga = fopen(tga_name, "w");
if (!tga)
{
return false;
}

putc(0,tga);
putc(0,tga);
putc(2,tga);
putc(0,tga); putc( 0,tga); //maporg
putc(0,tga); putc( 0,tga); //maplen
putc(0,tga);
putc(0,tga); putc( 0,tga); // xorigin
putc(0,tga); putc( 0,tga); // yorigin
putc(sw,tga); putc( sw>>8,tga); // sw
putc(sh,tga); putc( sh>>8,tga); // sh
putc(bpp*8,tga);

putc( 0,tga); // flag 0x20 means: inverted image.

fwrite(buf,sw*sh*bpp,1,tga);

fclose(tga);
return true;
}



bool SaveScreen(const char* filename)
{
int sw = ANCHO;
int sh = ALTO;
//int bpp = COLOR/8;
GLenum format = GL_BGRA_EXT ;
bool ret;

// Reservamos memoria para almacenar los datos de la imagen
unsigned char* pdata = new unsigned char[sw*sh*4];
//Leemos del buffer de la pantalla
glReadBuffer(GL_BACK);
//Leemos los pixeles que nos interesan
glReadPixels(0,0,ANCHO,ALTO,format,GL_UNSIGNED_BYTE,pdata);
//Guardamos los datos como un archivo tga
ret = WriteTga(filename,sw,sh,4,pdata);
//Liberamos memoria
delete [] pdata;
return ret;
}
.

Espero que esto pueda servir de ayuda sobre todo a quien como yo estén empezando en esto de la programación gráfica con opengl.

Gracias de nuevo por los consejos.

Un saludo.

...

Se me olvidaba, el vídeo  :).

http://www.youtube.com/watch?v=86gT7YlnVHU













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.