Hola, a ver si alguien me puede ayudar con esto.
Estoy haciendo unas rutinas de cálculo de lightmaps, que de momento están en una versión muy básica aún.
Para probarlas tengo un pequeño escenario, y una luz. Los lightmaps "parecen" generarse bien, pero al aplicarlos aparecen "rayas" extrañas en los bordes de algunos polígonos.
El sistema para generarlos por el momento es muy básico :
Para cada triángulo, generamos un pequeño lightmap de 8x8. Luego montamos un único archivo (un tga) con todos los lightmaps en él.
Muestro a continuación el resultado :
(http://www.andorstudios.com/ager/archivos/shotlm0.jpg)
La luz está justamente en la posición de la cámara (0,50,0).
El caso es que no sé cuál es el problema exactamente.
Podría ser la imprecisión al obtener las coordenadas de textura por tratarse de floats?
Podría ser algún tipo de interpolación con los lightmaps de alrededor? Todos son de 8x8 así que la textura grande es cuadrada.
En fin, a ver si alguien que haya tenido este problema o haya usado lightmaps me puede resolver la duda. Gracias!
Lo típico que suele ocurrir es que el filtrado de la textura coja pixeles de otro lightmap que no pertenece a ese polígono/objeto.
Como dice Ithaqua debe ser por el filtrado de textura.
Yo también me encontré con este problema hace unos años cuando me puse a crear un generador de lightmaps. Para solventarlo, lo que hice fue calcular el centro de masas del polígono que se está mapeando y entonces contraer un poco las coordenadas del lightmap en base a ese centro de masas. La verdad, tal vez no era una solución demasiado genérica pero por si te sirve...
Precisamente, hubo un hilo sobre este tema hace un tiempo
aquí.
Lo que no sé es si a KILE le sirvió de algo la solución que propuse...
Saludos.
Hola!
Te recomiendo que utilices los lightmaps que te genera el MAX 5. Son de muy buena calidad.
Un saludote!!
Cita de: MChizTe recomiendo que utilices los lightmaps que te genera el MAX 5. Son de muy buena calidad.
Bueno, mi idea es no usar el max5. En realidad tengo pensado una especie de editor de niveles muy básico, en el que cargues un 3ds, añadas unas cuantas luces y me fabrique los lightmaps correspondientes. Vamos, una utilidad para el motor y que pueda distribuir gratuitamente sin necesidad de que nadie haya de usar el max5.
Gracias por las respuestas! La verdad es que no me había dado cuenta del otro topic, voy a ver si me aclaro! :P
Hmmm creo que va a ser que calculo mal las coordenadas de textura y de ahí los "desplazamientos" que se pueden apreciar en los triángulos que forman el suelo (fijáos en las diagonales que aparecen). Puede ser esto?
Bueno pues he probado tu solución, BeRSeRKeR, (lo del centro de masas) reestructurando un poco el código, y no es ese el problema. De hecho se ve exactamente igual que antes. Por cierto, tu código se parece bastante al que estoy haciendo yo, seguramente nos basamos en el mismo tutorial. :rolleyes:
El de polygone si no recuerdo mal...
PD: aun conservo la URL.
Aquí está
Pues sí, ese era :lol:
Voy a seguir peleandome con esto a ver si lo resuelvo de una vez antes de volverme loco. El desplazamiento ese chungo me tiene mosca. (nooo)
A ver si te puedo ayudar. Cuando al aplicar un texel en pantalla la targeta hace el calculo bilineal para que no se vea todo pixelado lo hace cogiendo los texels que tiene alrededor. El problema te viene que esta cogiendo un texel de alrededor que pertenece a otro poligono. No me acuerdo como se llama pero en el caso de OpenGL tocando las opciones de texturas hay una que arregla ese problema.
Creo que te refieres GL_CLAMP o GL_CLAMP_TO_EDGE, no se cual de las dos es.
En Direct3D es D3DTADDRESS_CLAMP. La verdad es que doy por hecho que lo tiene activado.
Saludos.
Ager, al final solucionaste el problema?
No se si el fallo estará en lo del filtro bilineal en este caso, ya que en la imagen que nos has pasado parece que hayas renderizado el lightmap con nearest, ya que pueden verse perfectamente todos los texeles del lightmap.
Una pregunta, que formato de textura usais para los lightmaps?
En teoria con un formato de 8 bits bastaria no? Al menos si no quieres luces de colores.
¿Sirve para eso el D3DFMT_L8?
Por cierto eso que se ve en la imagen... no podria ser porque no tienes en cuenta la anchura de los pixeles al calcular las UV de un lightmap concreto dentro de la textura grande?
En teoria las coordenadas U,V deberian corresponder al centro del pixel. O sea que si la textura grande es de 512 tienes que desplazar las coordenadas U,V 0,5 veces 1/512
Es un valor muy pequeño pero puede ser la diferencia entre que escoja el pixel correcto o el del lightmap anterior.
Cita de: DraKKaRNo se si el fallo estará en lo del filtro bilineal en este caso, ya que en la imagen que nos has pasado parece que hayas renderizado el lightmap con nearest, ya que pueden verse perfectamente todos los texeles del lightmap.
Efectivamente, por el filtro bilineal no es, no lo tengo activado. Si observáis, se ven claramente los texels del lightmap.
Ryuchan, ahora mismo no tengo el código delante, pero podría ser por lo que comentas, ya que me temo que no lo había tenido en cuenta.
El caso es que ahora estoy en Castellón y hasta que no vuelva a Valencia creo que no podré echarle un ojo al código de nuevo :( .
En cuanto lo solucione os comentaré donde estaba el error, gracias!!! :lol:
PD : DraKKar lee tus Mensajes Privados :P
Me meto donde no me llaman... pero.... eso que dice ruychan, bien podria ser.
Es mas juraria que hay una opcion para indicar si quieres que las coordenadas de textura empiecen desde el centro del texel o desde su esquina.
Respondo a la babala, pero bien podria ser.
Tal vez Ryuchan se refería a
esto. Lo que hay que hacer es restar 0.5 a las coordenadas de textura para que el texel y el pixel coincidan.
Lo que pasa es que creo que eso sólo es válido en coordenadas de pantalla, es decir, cuando por ejemplo vas a dibujar con una proyección ortogonal para pintar texto 2D, sprites, etc.
Saludos.
El caso es que el otro día cuando estaba probando soluciones, "casi" doy con una. Yo trabajo con triángulos exclusivamente, por lo que siempre tengo 3 vértices. Lo que hacía es comprobar cúal o cuales tienen coordenadas del lightmap más a la derecha, y decrementar un poco su coordenada x. Para el que estuviera más a la izquierda, le aumentaba un poco la x. Lo mismo hacía para el eje y.
Con esto solucioné lo de las "líneas oscuras", pero el resultado no me convencía en absoluto, ya que se notaba demasiado el cambio de un lightmap a otro.
En fin, de momento como dije no puedo probar nada, ya que tengo el programita en otra casa, pero probaré todo lo que me estáis diciendo.
PD : Si acaso cuando lo solucione podría enviarlo como COTW o algo como agradecimiento. Eso sí, mi código suele ser algo warrillo :rolleyes:
Me gustaría saber como haces para distribuir los triángulos dentro del lightmap, supongo que habrán técnicas y algoritmos para solucionarlo. De momento yo lo hago de forma un poco cutre: sea como sean las proporciones del lightmap siempre les asigno una posición del mismo tamaño dentro del lightmap. Me gustaría saber como lo haceis vosotros.