¿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!
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)
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 ...
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)
En la
(http://webs.ono.com/dracular/ej.jpg)
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...
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.
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
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.incSaludos
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...
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.
CitarEn la
(http://webs.ono.com/dracular/ej.jpg)
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
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.
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
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.
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.
Con respecto al topic original...
En
Beyond3D hay un "thread" que trata el mismo tema