Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Diseño sistema materiales

Iniciado por KneDa, 16 de Diciembre de 2011, 01:26:04 AM

« anterior - próximo »

TrOnTxU

He estado leyendo otra vez tu descripción de pipeline, y me parece que lo habia interpretado mal  ^_^'

Más que las "Layers" que utilizo yo parece pipelines de renderizado tipo Horde3D, algo asi:

<!-- Forward Shading Pipeline -->
<Pipeline>
<CommandQueue>
<Stage id="Geometry" link="pipelines/globalSettings.material.xml">
<ClearTarget depthBuf="true" colBuf0="true" />
<DrawGeometry context="AMBIENT" class="~Translucent" />
<DoForwardLightLoop class="~Translucent" />
<DrawGeometry context="TRANSLUCENT" class="Translucent" order="BACK_TO_FRONT" />
</Stage>
<Stage id="Overlays">
<DrawOverlays context="OVERLAY" />
</Stage>
</CommandQueue>
</Pipeline>


¿Es algo parecido a esto lo que te refieres con pipeline?
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!

XÑA

Utilizas Forward Rendering o Deferred?

KneDa



Ummm, muy interesante lo de compilar a binario con posible compresión en fase de producción. En algún proyecto casero que tengo por ahí pendiente en C++ tenía en mente usar Json como formato intermedio y luego hacer algo parecido a lo que comentas, aunque no me he puesto a mirar ninguna librería C++ para tratar Json, recuerdo haber visto fugazmente alguna por google.code ... aunque no la había probado, alguna recomendación?

Con respecto a lo que comentas de 3, es lo que comentas y eso mismo hago yo en la fase de preprocesado. En cuanto a lo de la posición normalizada, simplemente fíjate en void vertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);  :)

Lo de los uniforms, va bastante bien, te da bastante flexibilidad y crear nuevos materiales es cuestión de pocos minutos una vez tienes los shaders.

Ummm, en cuanto a los pipelines, aprovecho la flexibilidad del lenguaje Js, en donde muchas veces es casi mejor evitar abstracciones y hardcodear las cosas, ya que es muy rápido, te pongo un ejemplo.

   // 7.-SSAO (FXAA)
   this.sceneManager.addPipeline("ssao_fxaa",
      function() {
         this.quadSSAO=manager.createQuadModel(["commonSSAO"],[0.0,0.0,0.0],[1.0,1.0,1.0]);   
         this.quadFXAA=manager.createQuadModel(["commonFXAA"],[0.0,0.0,0.0],[1.0,1.0,1.0]);   
   },
      function() {
         // 1º Pass (RTT Color buffer)
         common.rtt_0.rtt(function() { manager.render(0); });
         // 2º Pass (RTT Depth buffer)
         common.rtt_1.rtt(function() { manager.render(1); });

         // 3º Pass (RTT commonSSAO Effect)
         var refObj=this;
         common.rtt_2.rtt(function() {
            refObj.quadSSAO.parts
  • .materials[0].bgl_RenderedTexture="rtt_0";
                refObj.quadSSAO.parts
  • .materials[0].bgl_DepthTexture="rtt_1";
                refObj.quadSSAO.parts
  • .materials[0].bgl_RenderedTextureWidth=gl.viewportWidth;
                refObj.quadSSAO.parts
  • .materials[0].bgl_RenderedTextureWidth=gl.viewportHeight;
                manager.renderQuad(refObj.quadSSAO,numCameraQuad);
             });            

             // 4º Pass (commonFXAA Effect)
             this.quadFXAA.parts
  • .materials[0].uRTT="rtt_2";
             manager.renderQuad(this.quadFXAA,numCameraQuad);
       });

    Basicamente, tienes una función que inicializa los datos necesarios del pipeline y una función de render... En el pipeline se utiliza la funcionalidad del engine, igual no es muy muy elegante, pero en este caso va bien y se trabaja rápido. De todas formas, no descarto en un futuro crear una pequeña tool basada en nodos para agilizar el desarrollo de pipelines, pero otra tool equivale a más código a mantener... de momento esto va bien ;D

    Si, basicamente es parecido al formato que has puesto de Horde3D pero hardcodeado... ;)

    En cuanto a la fase final de optimizar todavía no me he parado mucho, pero si, es más o menos tal y como tu comentas.




TrOnTxU

Hola, he estado my liado con prespuestos y otras historias y no habia podido contestar desde hace dos semanas ... soy un "malqueda" :S

A la pregunta de XÑA: de momento es todo forward. Para dispositivos con fixed pipeline se utiliza solo una "configuración de renderizado", para programmable pipeline se puede utilizar single-pass o multi-pass ligthing.

La idea es que los efectos, sombras, etc. hasta ahora se ponian "a mano" en C++ en la "funcion de render", para cada proyecto en concreto. Y el sistema de "layers" te permitia seleccionar "objetos" a los que aplicar unos u otros efectos (cast/project shadows, real-time reflections, etc).

Pero visto, lo visto, esto es un peñazo insalvable, a no ser que como KneDa tengas la ventaja de tener la "funcion de render" en un lenguaje de script dinámico.


Al final estoy pasando todo a "data-drive" en ficheros de configuración LSON, con lo que para crear los RT, dibujar quads para post-screen, etc, se hace todo leyendo el archivo de configuracion.
Le voy a hacer caso a KneDa y voy a separar los pasos de los surface shaders, se renderizarán en el orden que dicte el archivo de configuración.
El deferred-shading por ejemplo, tendria que poder configurarlo desde el LSON también, así como HDR, diferentes tipos de shadows, etc.

Ya iré viendo, porque ahora hay curro, y de momento el sistema de materiales se va a quedar así, a no ser que ocurra algo de "fuerza mayor", y tenga que ponerme a "actulizarlo todo".


En cuanto a la pregunta sobre Json en c++ de KneDa: yo utilizo un "parser propio" bastante sencillito. Principalmente porque la syntaxis que utilizo para LSON no es exactamente Json. Más bien esta basado en esto: http://bitsquid.blogspot.com.es/2009/10/simplified-json-notation.html

Si que estuve buscando una vez, y encontre algo interesante: http://stackoverflow.com/questions/245973/whats-the-best-c-json-parser y un pagina con una lista de parsers, que no he podido volver a encontrar :(


Y en cuanto a lo de normalizar el atributo de la posicion del vertice lo decia porque yo marco como normalizados la normal (valga la redundancia) y los valores de color, por ejemplo, porque siempre van de 0 a 1 (o al menos deberian). En cambio la posicion del vertice puede ser cualquier numero, positivo, o negativo, y no deberia de estar normalizada. Por tanto yo en normalized para la posicvion pongo false, eso es lo que me habia extrañado.


Bueno, ya pondré como funciona esto del "data-driving pipeline" y como lo acabo de integrar con los surface shaders que tengo ahora ... cuando le pueda volver a dedicar unos dias para acabarlo.

Un saludo.
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!






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.