Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Pregunta Tecnica

Iniciado por Kaneda, 31 de Octubre de 2005, 07:45:16 PM

« anterior - próximo »

Kaneda

 Si , ehhh....hola, esto quisiera hacer una pregunta tecnica sobre el motor, no se si a lo mejor digo alguna tonteria pero bueno sean leves conmigo  :rolleyes:  XD

Me estoy empollando el codigo de la version v1 y me gustaria saber exactamente como se produce el multipass del renderizado.

1) Segun he creido entender en la clase escena , primero se renderiza una primera vez (primer paso) cada malla , que no tiene nada anormal.
Luego creo que por cada una de las luces de la escena se renderiza cada objeto una segunda vez. Me preguntaba como es que no se borra la info del backbuffer que hemos renderizado antes. He creido entender que habilitais un blending..... ¿pero que tipo de blending? es decir Alpha blending o Color Blending, es decir, en el segundo renderizado calculais dentro del perpixel.fx una componente alpha , o simplemente calculais el pixel.color normalmente y dejais que los colores se fundan??

2) En cuanto a un solo archivo .fx , que puede tener varios "pass", lo mismo , sobre como se realiza el multipass, en estos archivos creo que se puede indicar los "stages" directamente, ¿es asi como lo haceis? ¿ y que utilizais, el alpha blending de nuevo?

3) Ultima pregunta sobre multipass render. En el tuto 1 que habeis puesto en este foro, veo que ahora los materiales pueden tener varias layer (capas) (creo que eso es nuevo , porque en la v1 iba por apariencia.cs)
Como es el proceso de renderizar varias capas en un mismo objeto.... ¿todas las capas comparten el mismo effecto? ¿ Se vuelve a mezclar con alpha blending o habra algun tipo de parametro que diga el tipo de mezcla a usar

Perdonar por las molestias  :D  y gracias por adelantado  

BeRSeRKeR

 
Cita de: "Kaneda"1) Segun he creido entender en la clase escena , primero se renderiza una primera vez (primer paso) cada malla , que no tiene nada anormal.
Luego creo que por cada una de las luces de la escena se renderiza cada objeto una segunda vez. Me preguntaba como es que no se borra la info del backbuffer que hemos renderizado antes. He creido entender que habilitais un blending..... ¿pero que tipo de blending? es decir Alpha blending o Color Blending, es decir, en el segundo renderizado calculais dentro del perpixel.fx una componente alpha , o simplemente calculais el pixel.color normalmente y dejais que los colores se fundan??
No recuerdo cómo era exactamente en la primera versión del motor. Ahora mismo se hacen varias pasadas en las que vamos almacenando determinadas cosas. Por ejemplo tenemos una pasada donde se calcula la contribución de los objetos para luego aplicar el glow. En esa misma pasada se almacena en el canal alpha del RT la produnfidad de cada fragmento para luego calular el DOF en la pasada de postproducción. También tenemos otra pasada en la que almacenamos las normales en otro RT y otro para el gloss map. Digamos que es como hacer deferred shading pero nosotros seguimos calculando las cosas en world space. En realidad son muchas pasadas ya que no utilizamos MRTs. Los MRTs los utilizaremos cuando desarrollemos el codepath para el SM3. Está claro que entonces todo irá mucho más rápido.

Con respecto a las luces, efectivamente, después de almacenar lo que he dicho antes, para cada luz, y teniendo el additive blending activado, hacemos tantas pasadas como luces hayan y el resultado se va acumulando en un RT que después se modula sobre la escena "normal", es decir, la escena que sólo tiene aplicado el diffuse. Digamos que es como aplicar un lightmap.

Finalmente se lleva a cabo la postproducción, es decir, se calcula el glow, el DOF y los diferentes efectos que el usuario podrá crear como distorsión por calor, refracción (refracción que es diferente a la refracción en world space que se calcula en la primera pasada. Esta es una refracción más barata que se realiza en screen space, utilizando un normal map para perturbar las normales), etc.

En cualquier caso hay partes del motor que prácticamente desconozco por lo que puede que no haya sido muy específico. :)

Cita de: "Kaneda"2) En cuanto a un solo archivo .fx , que puede tener varios "pass", lo mismo , sobre como se realiza el multipass, en estos archivos creo que se puede indicar los "stages" directamente, ¿es asi como lo haceis? ¿ y que utilizais, el alpha blending de nuevo?
Bueno efectivamente en los fx se puede hacer multi-passing pero no es el cometido que le damos en nuestro caso. En nuestro caso es poco más que especificar el vertex & pixel shader y tener ciertas funciones que luego se reutilizan. Para el tema del multi-pass, utilizamos nuestros propios scripts de materiales. Y ahí es donde llegamos a tu tercera pregunta.... :D

Cita de: "Kaneda"3) Ultima pregunta sobre multipass render. En el tuto 1 que habeis puesto en este foro, veo que ahora los materiales pueden tener varias layer (capas) (creo que eso es nuevo , porque en la v1 iba por apariencia.cs)
Como es el proceso de renderizar varias capas en un mismo objeto.... ¿todas las capas comparten el mismo effecto? ¿ Se vuelve a mezclar con alpha blending o habra algun tipo de parametro que diga el tipo de mezcla a usar
Bien, el sistema de materiales de la versión 2.0 es muuuucho más potente (no tiene absolútamente nada que ver con la primera versión). Efectivamente se pueden especificar varias pasadas de render y para cada pasada se pueden especificar varios efectos (nosotros los llamamos geometry fragments y lighting fragments). Por ejemplo, puedes querer una superficie con una textura base de lava que tenga aplicado un geometry fragment que haga un scroll de las coordenadas de textura y otro geometry fragment que haga un efecto de turbulencias y finalmente otra pasada que tenga un geometry fragment que rote las coordenadas de textura. Esos geometry fragments los puede programar el usuario para realizar varios efectos, ya sea moificando las coordenadas de vértice, las coordenadas de textura o el color. Con el motor ya irán varios de tipos de geometry fragments como escalado, rotación, turbulencia, scoll, deformación de vértices para obtener efectos ondulatorios sobre las superficies, etc.

Luego también tenemos que puedes especificar lighting fragments. Estos son modelos de iluminación que el usuario puede programar para sus modelos. Por ejemplo el motor viene con Phong, Blinn-Phong o Minnaert. Como curiosidad, hace un tiempo programé un lighting shader que conjuntaba Phong con un Falloff, el efecto que tanto le gusta a zwitty :). También tenemos Oren-Nayar o Ward Isotropic pero son modelos de iluminación mucho más complejos que sobrepasan muchas veces el límite de instrucciones aritméticas de los pixel shaders 2.0 (64). Evidentemente se podrían codificar varias componentes en texturas (look-up tables o LUT) pero eso produce el típico efecto de "banding" por falta de precisión pero bueno, a veces es la única forma de conseguir este tipo de BRDFs en el SM2. Con el SM3 es otra cosa ya que el número máximo de instrucciones son 512, más que suficiente para implementar BRDFs más complejos. Esta es la razón por la que actualmente siempre se diga que la iluminación de los juegos es demasiado "plasticosa". Es porque no hay potencia para crear modelos más complejos.

Con respecto alpha blending, efectivamente, podrás especificar el tipo de blending para mezclar una capa con la anterior. Por ejemplo un additive blending para conseguir "glows", un alpha blending para aplicar texturas con canal alpha o alpha test...cualquier método de blending, en fín.

Y nada, eso es todo lo que se me ocurre por ahora. :)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Kaneda

 Jajajajaaj, joder Berserker, estoy impresionado , ufffffff, uffffff, fui a buscar una rama y me encontre todo un bosque , :-) . Enorme!!!! Menudo motor!!! Ahora, que me estoy dando cuenta de que vais a tener mogollon de trabajo con los tutoriales!!! muchos tipos de luces y de efectos :-) (magnifico)

Una pregunta , si un español (persona que no habla idiomas como inlges,chino, ruso, etc) quisiera adquirir conocimientos sobre directx, los shader, hlsl, etc, como para llegar a entender todas las partes de vuestro magnifico motor... ¿donde deberia acudir, a que libro o pagina web, etc?  

BeRSeRKeR

 
Cita de: "Kaneda"Jajajajaaj, joder Berserker, estoy impresionado , ufffffff, uffffff, fui a buscar una rama y me encontre todo un bosque , :-) . Enorme!!!! Menudo motor!!!
Yo estoy contento con el motor aunque soy bastante inconformista y a veces no dejo de darle la vara a Haddd sobre cómo creo que deberían ser las cosas. Eso es lo que tiene desarrollar algo entre dos o más personas, que a veces no se está de acuerdo, pero en fin, unas veces cede uno y otras otro. Otras veces llegamos a un término medio... :lol:

Pero en definitiva creo que el motor va bastante bien teniendo en cuenta la de cosas que hemos tenido que aglutinar. Creo que las piezas van encajando cada vez mejor y poco a poco iremos mejorando. La única pega grave que le veo en esta versión 2.0 y que se solucionará en la 3.0, es la ausencia de un sistema de visibilidad. También creo que el tema de efectos debería ser más flexible aún, pero en líneas generales creo que la cosa va bien. Pero como digo soy bastante inconformista y exigente. :D

Cita de: "Kaneda"Ahora, que me estoy dando cuenta de que vais a tener mogollon de trabajo con los tutoriales!!! muchos tipos de luces y de efectos :-) (magnifico)
Pues sí, hay mucho curro entre tutoriales, documentación y traducción. Menos mal que Vicente nos va a echar una mano. Además, no sólo van a ser tutoriales sobre el motor en sí, también va a haber una serie de tutoriales sobre cómo utilizar las herramientas de creación de contenido, es decir, exporters de MAX para el formato Haddd y MD5, utilización del visor/editor de escenas, etc. O sea que sí, hay muuuucho curro. :)

Cita de: "Kaneda"Una pregunta , si un español (persona que no habla idiomas como inlges,chino, ruso, etc) quisiera adquirir conocimientos sobre directx, los shader, hlsl, etc, como para llegar a entender todas las partes de vuestro magnifico motor... ¿donde deberia acudir, a que libro o pagina web, etc?
Es una pregunta complicada. El material en español sobre estos temas es casi inexistente. Los conocimientos que yo he ido obteniendo y que sigo adquiriendo han sido siempre a base de artículos, tutoriales, código de otras personas o propia experimentación. Libros tengo pocos. Pero eso sí, todo o casi todo lo mencionado está en inglés. De todas formas no hay tutoriales específicos que te enseñen todas las cosas que se hacen en el motor. Es un conocimiento adquirido a lo largo de los años a base de leer y experimentar mucho. Luego ya llega un momento en el que tienes el conocimiento suficiente para que, a veces, leer un simple mensaje en un foro haga que la bombilla se te encienda y seas capaz de implementar una determinada cosa. Es cuando eres capaz de predecir que algo que has programado o pensado va a funcionar como era de esperar. Pero eso es ya cuando uno tiene un conocimiento más avanzado, cuando eres capaz de leer y entender cosas que antes, cuando empiezas, te suenan a chino. Aún así, hoy día sigo quedándome a cuadros con algunos mensajes de gente como Yann Lombard (un usuario de GameDev que es una verdadera máquina), por poner un ejemplo. :D

Yo por ejemplo, recuerdo que ese cambio de estar dependiendo de los tutoriales de otros a poder ir por mi propia cuenta, fue cuando entendí las maravillas del producto escalar y vectorial y en definitiva todas las operaciones relacionadas con vectores. En serio, puede resultar una tontería pero en ese momento vi las cosas muy muy claras. Realmente fue un cambio espectacular. Supongo que a cada uno le llega eso de diferentes formas (yo hablo de programación 3D, claro).

En definitiva, que no tengo localizados una serie de tutoriales que te conviertan en un experto. La cosa está en ponerse delante del ordenador y empezar a buscar y leer artículos, tutoriales, mensajes de foros, código de otras personas y por supuesto plasmar todo eso en código. (ole)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Kaneda

  :rolleyes:  hombre , se que ahora estareis de trabajo hasta las cejas, pero ojala algun dia escribais tutos como los de tu pagina de directx 8 , pero con directx 9 (me los lei, muy buenos). Osea, 4 o 5 tutos de directx , con el codigo lo mas simplificado y claro posible que nos enseñase a usar archivos .fx , a usar filtros de post-produccion,o como se hacen los proyectores  y alguno teorico que nos enseñara por encima que es un blur, o un glow (explicado por expertos y en tu idioma siempre tiene un plus).
Osea algo muy muy basico que nos sirviera para formar una base de conocimientos. Porque luego ya , el entender una nueva tecnica de iluminacion o lo que sea , aunque este en ingles, pues puede ser mas o menos asequible, pero creo que es imprescimbible una BASE , para poder incluso luego sacarle todo el potencial al motor.  (genial)

Quien sabe, a lo mejor luego surge una seccion WIKI donde la gente aporta sus propios minitutos sobre alguna luz o efecto o sobre el uso del motor en general, o incluso alguien se atreve y aporta sus propios archivos .fx para el motor... (uoh)  

Haddd

 
Citar
Yo estoy contento con el motor aunque soy bastante inconformista y a veces no dejo de darle la vara a Haddd sobre cómo creo que deberían ser las cosas...

Eso es cierto  :blink: Es muy perfeccionista, yo soy mucho más práctico. Quizás por eso, el motor está en este punto....la mezcla de formas de trabajar tan diferentes ;)

Kaneda

 Hola, esto me gustaria replantear mi pregutna ( de verdad, siento ser pesado, os prometo que es la ultima vez que pregunto esto, es que al conocer vuestro motor , he conocido de verdad las posibilidades de directx y hlsl , asi que , qué mejor que preguntaroslo a vosotros, pero si no teneis tiempo prometo poner punto y final en este post  :P )

Vale, he conseguido el libro de Tom Miller ( Managed Directx) que sale en vuestro video. (muy bueno). El libro en si, esta muy bien , el hlsl esta comentado y tal. Pero sigue teniendo el mismo problema que cualquier otro libro de hlsl. Lo que me gustaria aprender no es hacer un effecto en concreto , si no como se hacen las mezclas de varias pasadas usando RenderTarget, y los effectos de postproduccion. Ejemplo: si mal no entendi, vosotros haceis varias pasadas , y vais poniendo varias informaciones en varios renderTarget , y luego al final es cuando haceis las mezclas con esos targets, con algun effect o algun tipo de blending.
Es eso lo bueno, osea el camino (path) hasta la escena final. Basicamente lo que necesitaria para entender bien el asunto seria que me aconsejarais un tutorial minimo o lo que sea , en español o ingles (ya me da igual) con algo de codigo, para entender como se utilizan varios render target y varias pasadas y luego se utiliza en efecto de postproduccion para conseguir la imagen final (la verdad es que con un codigo de ejemplo ya me vale, la teoria ya ire sacando de donde pueda). No se si me explico, mas que una referencia sobre hlsl , lo que me gustaria que me aconsejarais es una referencia (con codigo si es posible) sobre el "multipass rendering" para obtener una imagen final.
:D  lo de el multilayer material , jajaja, eso esperare a verlo en vuestro motor, porque segun lei antes, hicisteis vuestros propios scripts para indicar como se deben mezclar, y ufff eso en principio parece ser de un nivel demasiado complicado :rolleyes:  iremos paso a paso

Os felicito por el hecho de que el motor vaya a tener su propio formato , y que vayais a hacer un tuto sobre como exportar al motor con un plugin de max, ( me parece muy buena idea) y lo de newton fantastico, me parece un trabajo de nivel profesional de empresa de muchos empleados (Es que acabo de releerme el post y se me olvido felicitaros por ese dato que comento berserker)

P.D. He visto en el libro de Tom Miller , que es relativamente sencillo visionar una peli en directx ¿ el motor tendra esta posibilidad?  :ph34r:  

Haddd

 Bueno, eso lo decide la experiencia. Lees muchos tutoriales, y muchos libros o artículos, y vas trabajando, haciendo pruebas. No existe la forma perfecta, por desgracia, así que siempre estás peleando entre las ventajas de uno y las de otro.

Pero tu primero leete el libro y renderiza. Luego ya empiezas a estudiar otras alternativas....

Sobre lo del vídeo, no lo hemos hecho, pero si dice que es sencillo...supongo que lo será  :D  

BeRSeRKeR

 Como dice Haddd no hay que tener prisa, hay que ir poco a poco. Yo me he tirado unos cuantos años para llegar hasta aquí y bueno, lo que queda. Este es un camino que no tiene fin. :)

En cualquier caso explico un poco por encima el tema del blending y otras cuestiones.

Cita de: "Kaneda"Vale, he conseguido el libro de Tom Miller ( Managed Directx) que sale en vuestro video. (muy bueno). El libro en si, esta muy bien , el hlsl esta comentado y tal. Pero sigue teniendo el mismo problema que cualquier otro libro de hlsl.
Es lo que suele pasar, te lees un libro sobre una determinada cuestión y ya puedes decir que los has leído todos, salvo escasas excepciones, creo. :)

Cita de: "Kaneda"Lo que me gustaria aprender no es hacer un effecto en concreto , si no como se hacen las mezclas de varias pasadas usando RenderTarget, y los effectos de postproduccion. Ejemplo: si mal no entendi, vosotros haceis varias pasadas , y vais poniendo varias informaciones en varios renderTarget , y luego al final es cuando haceis las mezclas con esos targets, con algun effect o algun tipo de blending.
Bueno, no es que todos los RTs que mencioné en los mensajes anteriores se mezclen en algún momento. Por ejemplo el RT donde se almacenan las normales o el gloss map sólo se utilizan como una "tabla de datos" en la que en algún momento se accede haciendo un texture look-up (tex2D, normalmente). Por ejemplo en cada pasada de luz, se accede al RT de las normales (que se pasa como textura al pixel shader) para saber cuál es la normal para un fragmento determinado. O sea, que ahí no hay mezcla alguna.

Luego tenemos el tema de las múltiples pasadas de los materiales. Ahí si hay mezcla porque de lo contrario, si tenemos un material con 3 pasadas y no especificamos blending, la única pasada que vamos a ver va a ser la última. Entonces imagina que tenemos un material con dos capas. En una ponemos la siguiente textura base:



y en la siguiente capa especificamos la siguiente textura:



Entonces resulta que lo que queremos hacer es que la segunda capa se mezcle con la primera de forma que la textura de la segunda capa parezca un "glow" (tal vez no sea el mejor ejemplo de todos). Entonces para conseguir esta mezcla, tenemos que sumar las componentes RGB de la primera pasada con la segunda pasada. ¿Cómo?. Pues utilizando additive blending. El additive blending tiene como función para la fuente "Blend.One" y para el destino lo mismo. El resultado sería el siguiente (sacado con photoshop, método de blending "Screen"):



Para conocer los diferentes tipos de mezclas existentes y qué tipo de operaciones realizan sobre la fuente y el destino, échale un vistazo a la ayuda del SDK.

En el caso de los efectos de postproducción, lo que se suele tener es una pila de efectos que se va recorriendo. Entonces se activa un RT donde se almacenará el resultado de aplicar el efecto y sobre un quad que ocupe toda la pantalla se aplica el RT (en forma de textura) que contenía el resultado del efecto anterior y así sucesivamente hasta que no queden más efectos de postproducción.

Nosotros además hemos introducido algo similar a Doom3, los objetos de post producción. Dichos objetos se renderizan al final, de forma que pueden afectar de alguna forma la imagen que hay tras ellos. Por ejemplo los cristales serían objetos de postproducción ya que se renderizan al final con un normal map aplicado que es a través del cual perturbamos las normales. Entonces utilizamos esa normal para calcular las coordenadas de textura desplazadas que se utilizarán para acceder a la textura que contiene la escena que estaba almacenada en el RT anterior. Tal vez pueda sonar un poco lioso si no has oído hablar antes sobre estas cosas. :)

Cita de: "Kaneda":D  lo de el multilayer material , jajaja, eso esperare a verlo en vuestro motor, porque segun lei antes, hicisteis vuestros propios scripts para indicar como se deben mezclar, y ufff eso en principio parece ser de un nivel demasiado complicado :rolleyes:  iremos paso a paso
El tema de los scripts de materiales no es que sea complicado en exceso aunque sí hay que tener ciertos conocimientos técnicos sobre programación gráfica. Más que nada los métodos de blending existentes para mezclar las diferentes pasadas de render. Porque por lo demás es prácticamente como especificar los parámetros de los materiales de MAX. Excepto en el caso de especificar los geometry & lighting fragments que es algo que no hay en MAX, claro. Lo cierto es que desarrollar estos materiales sería mucho más sencillo y rápido si me hubiera dado tiempo a desarrollar el editor de materiales. Para la próxima será. De todas formas consolaros con que la gente de id y Raven (en muchos casos los propios grafistas) tuvieron que crear los cientos de materiales (que también son scripts, similares a los nuestros) de Doom3 y Quake4 a manita. :P

Cita de: "Kaneda"P.D. He visto en el libro de Tom Miller , que es relativamente sencillo visionar una peli en directx ¿ el motor tendra esta posibilidad?  :ph34r:
Es algo que no nos hemos planteado en esta versión pero me imagino que para la siguiente algo se hará. De esta forma podremos tener pantallas como las de Doom3 o Quake4 en las que se proyectan videos. :)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Kaneda

 muchas gracias por la contestacion , y perdonad por ser tan pesao  :lol:  






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.