Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sistema De Materiales

Iniciado por BeRSeRKeR, 30 de Julio de 2005, 06:11:54 AM

« anterior - próximo »

BeRSeRKeR

 Hola.

Estos días atrás hemos estado desarrollando el sistema de materiales para el motor. El sistema es similar al que se puede encontrar en quake3 o doom3. Al igual que en estos dos juegos, nuestro sistema también se basa en un sistema de capas.

El material se define a través de un script en el que, además de las capas, se definen las texturas que forman cada capa, los sampler y render states y algo importante, también se definen los fragmentos de shader y los valores de las variables de dichos fragmentos. Estos fragmentos son trozos de shader que llevan acabo una determinada funcionalidad. Por ejemplo, aquí tenéis un fragmento que realiza un scroll:

#region VAR

float2 uvScroll_Speed;

#end VAR

#region VS
{
   data_in.texCoord0.x -= uvScroll_Speed.x * ENV_Time;
   data_in.texCoord0.y += uvScroll_Speed.y * ENV_Time;
}
#end VS


Como podéis ver, hay dos secciones. En una se declaran las variables que utilizará el fragmento y en la otra el código que implementa la funcionalidad del fragmento. En este caso hacer un scroll de la textura.

Luego en el material (tenéis el código completo al final) podemos aplicar dicho fragmento y especificar los valores de las variables de la siguiente forma:

geometryShader "uvScroll" {

   param "uvScroll_Speed" ( 0 1 )
}


Lo bueno de este sistema es que te permite crear tus propios materiales sin tocar una sola línea de código del motor. Simplemente es crear los fragmentos de shader que necesites (geometry o lighting shaders, muchos ya irán "de serie" con el propio motor) y crear el script del material. Luego se creará un nuevo tipo de material en MAX para poder asignar estos materiales desde el propio MAX.

Evidentemente también se ofrecerá la posibilidad de crear estos materiales de forma visual a través de un editor de materiales que está a medio desarrollar. :)

He creado un pequeño video (~1MB, xvid) donde se muestran tres materiales. El primero es muy chorra y es el que he creado para hacer pruebas. Los otros dos os resultarán muy familiares a los que hayáis visto quake3. :D

Concretamente, el último es el más complejo y consta de cuatro capas. Este es el código de dicho material.

// blocks15cgeomtrn.material

material "blocks15cgeomtrn" {

   renderStates {

       cull        CCW
       fillMode    Solid
   }

   layer "layer0" {


       map diffuse {

           fileName    "escenas/VolumetricLight/firegorre.tga"
           
           amount      1.0

           samplerStates {

               addressU        Wrap
               addressV        Wrap
               minFilter       Linear
               magFilter       Linear
               mipFilter       Linear
           }
       }
       
       renderStates {

           alphaBlendEnable        false
           alphaTestEnable         false
           zEnable                 true
           zBufferWriteEnable      false
       }

       geometryShader "uvScroll" {

           param "uvScroll_Speed" ( 0 1 )
       }

       geometryShader "uvTurbulence" {

           param "uvTurbulence_Amplitude"  0.25
           param "uvTurbulence_Phase"      0
           param "uvTurbulence_Frequency"  1.6
       }

       geometryShader "uvScale" {

           param "uvScale_Scale" ( 0.5 0.5 )
       }
   }

   layer "layer1" {


       map diffuse {

           fileName    "escenas/VolumetricLight/blocks18cgeomtrn2.tga"
           
           amount      1.0

           samplerStates {

               addressU        Wrap
               addressV        Wrap
               minFilter       Linear
               magFilter       Linear
               mipFilter       Linear
           }
       }
       
       renderStates {

           alphaBlendEnable        true
           sourceBlend             SourceAlpha
           destinationBlend        InvSourceAlpha
           alphaTestEnable         false
           zEnable                 true
           zBufferWriteEnable      false
       }

       geometryShader "uvRotation" {

           param "uvRotation_Speed" 30
       }

       geometryShader "uvStretch" {

           param "uvStretch_WaveType"      0
           param "uvStretch_WaveParams"    ( 0.8 0.2 0.0 0.2 )
       }
   }

   layer "layer2" {


       map diffuse {

           fileName    "escenas/VolumetricLight/blocks18cgeomtrn2.tga"
           
           amount      1.0

           samplerStates {

               addressU        Wrap
               addressV        Wrap
               minFilter       Linear
               magFilter       Linear
               mipFilter       Linear
           }
       }
       
       renderStates {

           alphaBlendEnable        true
           sourceBlend             SourceAlpha
           destinationBlend        InvSourceAlpha
           alphaTestEnable         false
           zEnable                 true
           zBufferWriteEnable      false
       }

       geometryShader "uvRotation" {

           param "uvRotation_Speed" 20
       }

       geometryShader "uvStretch" {

           param "uvStretch_WaveType"      0
           param "uvStretch_WaveParams"    ( 0.8 0.2 0.0 0.1 )
       }
   }

   layer "layer3" {


       map diffuse {

           fileName    "escenas/VolumetricLight/blocks15cgeomtrn.tga"
           
           amount      1.0

           samplerStates {

               addressU        Wrap
               addressV        Wrap
               minFilter       Linear
               magFilter       Linear
               mipFilter       Linear
           }
       }
       
       renderStates {

           alphaBlendEnable        true
           sourceBlend             SourceAlpha
           destinationBlend        InvSourceAlpha
           alphaTestEnable         false
           zEnable                 true
           zBufferWriteEnable      false
       }
   }
}


Evidentemente el sistema se puede ampliar mucho más. Por ejemplo se podría hacer que el material hiciera referencia a su vez a un shader de sonido que sería el que se reproduciría en el caso de que el jugador (por poner un ejemplo) entre en contacto con una superficie que tenga aplicado dicho material.

¡Bueno, eso es todo por ahora!

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

Lord Trancos 2

 Que pasada...  (ole)

Como de costumbre me habeis dejado sin palabras y con los dientes mas largos que una morsa.  :ph34r:  
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

zupervaca

 me imagino que todo ese archivo luego se convertira a un shader no?

BeRSeRKeR

 
Cita de: "zupervaca"me imagino que todo ese archivo luego se convertira a un shader no?
En realidad el shader (o los fragmentos de shader) ya tiene que estar escrito. El material lo que hace es indicar los fragmentos que se utilizarán y los valores de las variables de dichos fragmentos. Entonces luego el motor, el EffectBuilder concretamente, es el que se encarga de aglutinar todos los fragmentos en un único shader.

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

Pogacha_Reserva

 Aun que no parezca este es un paso importatisimo ...

Espero que sigan con este entusiasmo!

El video esta buenisimo ...  (ole)

Saludos.

BeRSeRKeR

 
Cita de: "Pogacha_Reserva"Aun que no parezca este es un paso importatisimo ...
Lo cierto es que sí, como he dicho antes, ésto permite añadir muchos efectos al motor sin tocar una sóla línea de código. Está claro que cuantas más cosas se controlen a través de scripts (materiales, partículas, sonidos, cinemáticas, IA, etc), más flexible será el motor y mayor será la posibilidad de que cualquiera pueda crearse contenido propio ya que no tendrá que instalarse el compilador de C#, ni la SDK de DX y claro, tampoco vamos a comparar el código de un script con el código del motor. Aún así está claro que algo de conocimientos de programación gráfica se tiene que tener para poder crear este tipo de materiales, evidentemente. Por ejemplo conocer los tipos de blending (muy similar a los de photoshop), los tipos de filtro de texturas...pero vamos que eso llega un momento que se hace repetitivo y se hace fácil de aprender. Y si encima hay un editor pues mucho más fácil aún. :)

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






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.