Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Haddd en 29 de Diciembre de 2003, 01:41:24 PM

Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Haddd en 29 de Diciembre de 2003, 01:41:24 PM
 He subido a Ese ejemplo de luces

un ejemplo de una esfera a la que le afectan 2 luces. El sistema que utilizo es el de multipass, de esta forma se soporta un nº ilimitado de luces. Pulsando 1 dejamos sólo una luz activa, y pulsando 2 activamos las dos. Fijaos en la bajada de FPS al tener las dos luces activadas. Hace tiempo lei un doc, creo que en ATI, que decía que el multipass era una buena opción porque si no se veia el objeto, el 2º paso no se ejecutaba. Bien, tiene toda su lógica, pero con el ejemplo que os pongo, si se ve todo el objeto, es muy costoso. Esto es un poco.. :angry:  porqué los shaders 2.0 no se puede decir que tengan mucho espacio para las constantes.

Bueno, este ejemplo SOLO funciona con shaders 2.0. Incluye el archivo de effect con una explicación de como funciona el shader, aunque es bastante trivial.

Ya me contareis. A mi me funciona a unos 50 fps con dos luces y 93 FPS con una luz sin mover para nada la cámara.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 29 de Diciembre de 2003, 03:20:29 PM
 Me va a unos 56 fps con las dos luces y a 97 fps con una sóla luz.

Y con respecto al render. No sé si esto será correcto para una escena "real" pero en RenderMonkey hice una prueba, también con una esfera. Y lo que hacía era.

Primero renderizar la esfera con luz ambiente y con el test y la escritura del depth buffer activada. Sin texturas ni alpha blending.

Después, por cada luz, renderizaba la esfera con su textura, los cálculos de iluminación per-pixel, etc. Pero desactivaba la escritura en el depth-buffer y activaba el test con LESSEQUAL. Evidentemente, activaba el blending para ir acumulando la luz. Por ahí leí una vez que lo óptimo es activar el depth test con EQUAL, pero probé y dejaba de funcionar correctamente.

Así, con 3 luces y poniéndolo más o menos en la misma posición que tú, me va a unos 60 fps. Claro que también dependerá de cómo renderice RenderMonkey los objetos, etc.

Saludos.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Haddd en 29 de Diciembre de 2003, 03:44:23 PM
 El problema del Equal es que por ejemplo ATI tiene una tecnología de ZBuffer, ahora no recuerdo el nombre, que comprimen muchísimo la información, PERO eso provoca que el EQUAL no funcione correctamente, por lo que recomiendan(gracisiolla esa palabreja) que no se utilice EQUAL.

Lo que no probaba era eliminando la escritura de Z a partir de la segunda pasada. Pero lo acabo de probar y no se gana nada ( lo cual hace pensar que está muy optimizado lo del Z Buffer!!)

Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: DraKKaR en 29 de Diciembre de 2003, 04:11:12 PM
 No soy un experto en vertex shaders, pero no concibo porque necesitas hacer una pasada por cada luz, y no hacerlo todo de una sola pasada. Máxime teniendo los bucles de los pixel shaders 2.0.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Haddd en 29 de Diciembre de 2003, 04:37:16 PM
 Pues porque para cada luz necesitaría pasarle al pixel shader un light vector y una atenuación. Si cada uno de estos me ocupa una coordenada de textura y sólo tengo 8, imagínate!!

Y siento decirque que con pixel shaders 2.0 NO se pueden hacer bucles.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 29 de Diciembre de 2003, 04:59:48 PM
 Una posible explicación sería que a la hora de hacer multipass shadow volumes se hace de esa forma así que aprovechas y das una pasada más para renderizar con la luz activada pero desactivando la escritura en el depth buffer.

Puede que en escenas simples no se note, pero en escenas muy complejas con mucho "over-drawing", sí se note un incremento en el rendimiento.

Este es el sistema que utiliza Doom3, por ejemplo.

Saludos.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 29 de Diciembre de 2003, 05:02:38 PM
Cita de: "Haddd"Y siento decirque que con pixel shaders 2.0 NO se pueden hacer bucles.
Creo que no se pueden hacer bucles "dinámicos", es decir, bucles en los que no se sabe el número de iteraciones. Eso es porque los pixel shaders, actualmente, lo que hacen es generar el bloque de instrucciones que hay dentro del bucle tantas veces como iteraciones hayan. O sea que el número de iteraciones debe ser constante.

Saludos.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: MChiz en 29 de Diciembre de 2003, 10:04:33 PM
 Hola!
Yo cuando hice mis pruebas utilice el modo EQUAL y no tuve ningun problema.
Tengo una GeForce 4 TI 4200. No he probado con Pixel Shaders 2.0
Cuando me compre la GeForce 5700 te digo algo del ejemplo : )
talogoo!!
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Minos en 29 de Diciembre de 2003, 10:56:43 PM
 Me funciona a la perfeccion:

GeForce FX 5600

25 fps 2 luces
55 fps 1 luz

El ordenador estaba bastante cargado,lleva 5 dias sin apagarse  :rolleyes:  
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 29 de Diciembre de 2003, 11:05:29 PM
Cita de: "Minos"El ordenador estaba bastante cargado,lleva 5 dias sin apagarse  :rolleyes:
Ahora que lo dices, el mio lleva encendido casi 3 semanas y no he reiniciado una sóla vez :D

Por cierto, Minos, ¿qué procesador tienes?.

Saludos.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: _Grey en 29 de Diciembre de 2003, 11:06:10 PM
 Vale, yo tampoco domino los shaders.....   :rolleyes: , pero los datos de la luz que comentas, no seria mas "normal" que estan en las constantes del shader, por mucho que no sean muchas?
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 29 de Diciembre de 2003, 11:11:19 PM
Cita de: "_Grey"Vale, yo tampoco domino los shaders.....   :rolleyes: , pero los datos de la luz que comentas, no seria mas "normal" que estan en las constantes del shader, por mucho que no sean muchas?
Hay cosas que no puedes pasar a través de constantes.

Por ejemplo, el vector "Light", el vector "Half-Way" o  "View" dependiendo de cómo calcules el specular, etc, son datos que se los tienes que pasar al pixel shader a través del vertex shader utilizando los registros de coordenadas de textura. En ningún caso pueden ser constantes ya que varían dependiendo del vértice procesado.

Saludos.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Minos en 30 de Diciembre de 2003, 12:41:56 AM
 Pues de procesador un P4 2,6, 800mhz de bus.
Y de ram 512 ddr.


saludos
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 30 de Diciembre de 2003, 02:36:36 AM
 Pues que raro, a mi con un P4 1,4 Ghz y 256 MB de RAM, me tira a 56 fps con las dos luces y a 97 fps con una sóla luz...

¿Tanta diferencia hay entre la Radeon 9600 (que no es la Pro) y la GeForceFX 5600?

Saludos
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Minos en 30 de Diciembre de 2003, 01:55:38 PM
 Pues la verdad me extraña tanto la diferencia, lo mas seguro que sea por todo lo que tiene ejecutandose a la vaz (supongo) y que no estan los ultimos drivers puestos.
Mas tarde reinicio, quito todo e instalo los ultimos drivers y te digo, que ahora me esta bajando el fallout 2 a 18 kbps y es una pena quitarlo  :D

PD: Interplay esta haciendo Fallout 3!!! (noticia de hace 4 dias en meristation)
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Minos en 31 de Diciembre de 2003, 01:09:22 PM
 Depende mucho de donde pongas la camara..
Si la pones de modo que la esfera este centrada y empiece justo donde acabaron la letras (la 3ª linea de texto) me da:

1 luz  50 fps
2 luces 36 fps

Pero en cambio si no muves la camara y la dejas justo donde empieza me da esto otro:

1 luz 31 fps
2 luces 16 fps

Te sale mas o menos parecido en la redeon??
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 31 de Diciembre de 2003, 02:03:34 PM
 Sin mover la cámara:

56 fps con las dos luces
97 fps con una sóla luz

Alejando la cámara de forma que los bordes de la esfera se ajusten a la ventana:

81 fps con las dos luces
134 fps con una sóla luz

Se vé que nVidia se ha peleado con MS y ahora hace malos drivers para Direct3D. ;)

Pero vamos, no es algo nuevo. Gabe Newell ya dijo que Half-Life 2 en las nVidia iba fatal y que tenían que andar haciendo optimizaciones específicas para ellas. En cambio con las de ATI no tenían que hacer nada especial.

Yo la verdad es que me alegro de haberme pasado a ATI. Barata y potente (y eso que la Radeon 9600 que tengo no es la Pro)...

Saludos.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: tywok en 31 de Diciembre de 2003, 02:43:46 PM
 ey, berserker.... pues yo tengo la 9600pro y con las 2 luces sin mover la camara me da unos 65 fps...... mira q son caros esos 9fps xDDDD
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 31 de Diciembre de 2003, 02:44:20 PM
 Minos, lo único que se me ocurre es que si tienes instalado el SDK de Direct3D, tengas las runtime en modo Debug, lo cual explicaría que vaya así.

Saludos.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: BeRSeRKeR en 31 de Diciembre de 2003, 02:46:13 PM
Cita de: "tywok"ey, berserker.... pues yo tengo la 9600pro y con las 2 luces sin mover la camara me da unos 65 fps...... mira q son caros esos 9fps xDDDD
Claro, por eso he dicho lo de "Barata y potente (y eso que la Radeon 9600 que tengo no es la Pro)" :)
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: MChiz en 02 de Enero de 2004, 09:43:11 PM
 Ei Hadd! Acabo de caer... dices que con el DepthTest a EQUAL no te funciona y tienes que ponerlo a LESSEQUAL, verdad? Me refiero a cuando haces cada pasada por luz.
Cuando renderizas con la luz ambiente, para estabilizar zetas y demas, utilizas la fixed pipeline o un shader?
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Haddd en 03 de Enero de 2004, 09:56:40 AM
 La luz ambiente la hago en la primera pasada junto a la primera luz
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: MChiz en 03 de Enero de 2004, 12:31:42 PM
 Quieres decir que eso es buena idea? Lo digo porque vas a calcular la iluminacion para pixels que seguramente no se vayan a ver. Si no estoy equivocado, lo mejor es pintar primero la escena con solo la luz ambiente y luego hacer una pasada por cada luz, tan solo donde las Zs sean iguales. Me explico??
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: Haddd en 03 de Enero de 2004, 01:20:32 PM
 Cierto, pero para esta prueba era un poco tonto porque se ven todos, los que no se ven, se recortan por Culling.
Título: Ejemplo De Per Pixel Con 2 Luces
Publicado por: MChiz en 03 de Enero de 2004, 01:42:09 PM
 Por supuesto  :)