Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Arquitectura de D3D

Iniciado por Haddd, 29 de Abril de 2003, 07:26:30 PM

« anterior - próximo »

Haddd

                                ¿Hay alguna forma de realizar el Depth Test ANTES de que se ejecute el Pixel Shader? Sería lógico que si no se modifica la Z en el shader, se realizara antes el Depth test..¡y además se podrían utilizar otras optimizaciones!                                

ibasurto

                                Lo que puedes hacer es usar dos pases, uno en el que solo se rellena Z y otro donde se evalua el pixel shader (deferred rendering a la DOOM 3)                                

Haddd

                                Exacto, pero como el Z Depth Test se ejecuta DESPUES del Pixel Shader, no veo la ventaja!! Si fuera ANTES sí que se ganaría mucho, pero ...                                

ibasurto

                                Tienes que mandar la primitiva de dibujo dos veces con distintos modos:  

1/ pintar una vez el  triangulo con solo Z sin pixel shader  ni color

2/ vuelves a pintar sin Z pero con pixel shader, con el depth test a modo pintar si Z igual

Es un balance, pierdes capacidad de procesar vertices a costa de optimizar la capacidad de procesar pixeles (solo se procesan los pixeles que realmente se ven)                                

Haddd

                                En la


parece muy claro que el Z Test se hace DESPUES del Pixel Shder, así que no sé que ganarás!! Si fuera ANTES sí que tiene ventajas, puesto que como tu bien dices, ya no procesará el pixel shader, pero al ser después...                                

BeRSeRKeR

                                Supongo que la ventaja está en que en el primer pass sólo se pintan los polígonos sin textura, sin cálculos de iluminación, etc (en definitiva no se procesa ningún pixel shader) sólo escribiendo en el zbuffer la información de profundidad, lo cual es bastante rápido. En el siguiente pass desactivarías el zwrite pero dejarías activada la comparación de profundidad y sólo se procesarían los pixel shaders para aquellos pixels que son visibles. Eso debería acelerar las cosas...

Como dice ibasurto es la técnica que utiliza Carmack en Doom3...supongo que lo de realizar el depth test antes de procesar el pixel shader no es viable...aunque tampoco es algo que pueda asegurar al 100%

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

BeRSeRKeR

                                Bien, he releído mi post anterior y efectivamente, si el depth test se realiza después de procesar el pixel shader, siempre se procesarán todos los pixels...tanto los visibles como los no visibles...¿no?...cuando he escrito ese post, pensaba en que la comparación se realizaría antes de procesar el pixel shader pero veo que no...

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

BeRSeRKeR

                                Aqui pongo una entrevista a Carmack en la que se habla un poco sobre este tema...por si sirve de algo

http://www.beyond3d.com/interviews/carmack...?page=page2.inc

Saludos

PD: lo que si está claro es que aunque, al parecer, se procesan todos los pixels, sólo se escribirían en el frame buffer los visibles y además, en el segundo pass, no se escribiría en el depth buffer...sólo se extraería la información de profundidad para poder realizar el test de profundidad, lo cual aceleraría algo las cosas...                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

                                La única forma es utilizando el Stencil, pero no se me ocurre cómo resolverlo.
Hay un técnica en la que a nivel de pixel shader se empaqueta la información y después se procesa la iluminación. Pero obliga a tener una tarjeta con una profundidad de color de 128 bits. Sin embargo es bastante óptimo desde mi punto de vista, puesto que la iluminación sólo ocurre en los pixels que realmente se dibujan. No recuerdo la web, pero creo que se llemada deferred shading y está en Delphi.                                

BeRSeRKeR

                                Si ya me acuerdo del artículo. Está en

http://www.delphi3d.net/articles/viewartic...le=deferred.htm

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

ibasurto

                               
CitarEn la


parece muy claro que el Z Test se hace DESPUES del Pixel Shder, así que no sé que ganarás!!

Ancho de banda... (como apunta berseker)

...pero es verdad, si estas limitado por procesamiento de pixel shader (y no por ancho de banda) tampoco te arregla nada;  creo que el stencil tampoco ayuda por que tambien esta despues

queda la opcion descrita en Delphi3D o filtrar a nivel de primitivas: si primero dibujas toda la escena solo en Z luego puedes saber si grupo de primitivas se vera o no  usando adecuandamente la funcionalidad de la extension OpenGL HP_occlusion_test o a la NV_occlusion_query (no se a que pueden corresponder en DirectX)  

Ademas, creo que las ultimas radeon pueden, automaticamente, descartar un triangulo entero si saben que, por el contenido de Z buffer, no se ve


p.s.
Parece ser que doom3 pinta primero solo en Z por el tema de las sombras y no por la optimizacion que Haddd sugiere                                

Tei

                                no me he enterado de casi nada pero me ha parecido muy interesante vuestra conversacion.

Hay algun truco para hacer las sombras por stencil buffer rapidas?
yo lo hago de la forma sencilla, dibujo la sombra con:

glEnable(GL_STENCIL_TEST);         
glStencilFunc(GL_EQUAL,0,1);
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR);

y cuando toca, borro el buffer (al empezar nuevo frame)

   glClearStencil(0);
   glClear(GL_STENCIL_BUFFER_BIT);

No se que estoy haciendo mal porque va lentisimo cuando la sombra ocupa un porcentaje grande de la pantalla.                                

BeRSeRKeR

                                No sé si estás haciendo algo mal pero lo que si te puedo decir es que las operaciones con el stencil buffer son lentas por naturaleza...dependerá de qué aceleradora utilices. Por ejemplo al activar las sombras de estarcido en el quake3 con la TNT2 que tenia, iba de pena. Ahora, con la GeForce3 es jugable :jaja:

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

Tei

                               
CitarNo sé si estás haciendo algo mal pero lo que si te puedo decir es que las operaciones con el stencil buffer son lentas por naturaleza...dependerá de qué aceleradora utilices. Por ejemplo al activar las sombras de estarcido en el quake3 con la TNT2 que tenia, iba de pena. Ahora, con la GeForce3 es jugable :jaja:

Saludos

pues tendre que mirar los motores de quake2 a fondo porque en ellos hacen exactamente lo mismo que en mi motor (quake1) y no recuerdo que fuera tan lento. Eso si, aveces hacen como campos de energia que envuelven el modelo y esos les van lentisimo, mientra que el uso que he echo de transpariencias no es tan lento...

Por cierto. Supongamos que tengo plantas, por ejemplo modelos md3, supongamos que las plantas tienes hojas en las texturas y transpariencias... Con que modo tengo que dibujar eso? Tengo que ordenar primero los poligonos? Me ocurre que lo ultimo que dibujo tapa lo anterior, de modo que la parte transparente del poligono muestra el fondo... como si no huberia mas poligonos del modelo!.. supongo que sabeis lo que quiero decir. Imagino que habra que dibujar el modelo en otro modo, con INDEX alpha, o algo por el estilo.. pero no entiendo mucho de ello. Si creeis que deberia leer mas del tema me podeis recomendar alguna lectura en internet o por ahi, para bajar lo mejor.                                

BeRSeRKeR

                                Supongo que utilizas alpha blending para conseguir la transparencia de las plantas. Para evitar tener que ordenar de atrás hacia adelante puedes probar a utilizar alpha test en vez de alpha blending. Si no recuerdo mal, con el alpha test no importa el orden en el que se renderizan los polígonos...

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.