Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





BackFace Culling

Iniciado por Drácula, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Drácula

                                Se habla mucho aqúí de la optimización BackFace Culling. Sin embargo, en mi primer motor implementé y estudié ampliamente esta opción y...¡no se ganaba tiempo en absoluto!
Y de verdad que estudié mucho el tema, probando diferentes técnicas y en ningún caso, en ninguno, valía la pena.

¿En qué me equivoqué?                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

BeRSeRKeR

                                Supongo que la cosa estará en la carga que le metas al engine...un engine como por ejemplo el de quake3, tengo entendido que realiza muchos calculos para el backface culling así que por algo será...y es que en el caso concreto de quake3 hay que tener en cuenta que se pueden dar más de 4 pasadas por face [textura base + detalles (que pueden ser bastantes pasadas) + lightmap + niebla]...así que ahí supongo que vale la pena el backface culling ya que evitas un gran nº de cálculos.

Conclusión...pues que si el engine no da muchas pasadas por face con distinto tipo de efectos aplicados (scroll, turbulencias, rotaciones, deformación de vértices, etc) pues no se notará pero si es el caso contrario pues puede que si se note un incremento en el rendimiento...pero no te lo puedo asegurar :sonriendo:

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

Drácula

                                Berserker:

Según lo que tu me dices, lo que hay que hacer no es Back Face Culling, sino Back Vertex Culling!!

Sigo creyendo que el Back Face Culling NO tiene sentido. Yo incluso ordenaba las caras de los objetos para que el BackFace fuera óptimo...¡y ni así se ganaba!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

BeRSeRKeR

                                Tal vez tenga un concepto equivocado del backface culling...:sonriendo: ¿no se trata de descartar las caras según su orientación con respecto a la cámara?.

Por otra parte...¿que es el back vertex culling?...¿el resultado no es lo mismo que el backface culling?...al fin y al cabo con el backface culling ¿no estás descartando vértices?...

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

Drácula

                                No es lo mismo el Back Face que el Back Vertex(que es un concepto que me inventado yo después de tu primera respuesta!)

El problema del back face culling es que no sirve para nada si no puedes descartar los 3 vértices que forman la cara. Pero para poder descartar los 3 vértices tienes que RECONSTRUIR la indexación de las caras. Y además tienes que SABER que puedes descartar esos 3 vértices.
Y TOOOOODOOO esto para no pintar una cara que el hardware ya decide por sí solito que NO tiene que pintarla.

Por eso digo que no sirve para optimizar. Sin embargo he leido muchos posts donde parece que sí lo usais para tal acción, y por ello mi pregunta de a ver si el método que utilizais realmente optimiza.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

turrican

                                Yo creo que el backface culling si es de gran utilidad, por el simple hecho de que te ahorras la rasterizacion de un monton de caras a costa de un simple dotproduct, y eso para cualquier tarjeta grafica es un gran alivio.
Todo depende del tipo de motor, pero tranquilamente puedes llegar a ahorrarte el render del 40% de las caras de la escena!

Lo de que dices Dracula es que la tarjeta ya hace el backface culling por ti. En ese caso (si la tarjeta tiene procesamiento de vertices por hardware) puedes ahorrarte el hacerlo tu, pues ella lo hara mucho mas rapido.
Lo que no debes hacer nunca es hacer el backface culling tu a mano y dejarle a la tarjeta que lo haga tambien. No me extraña que no consiguieras fps, lo que me extraña es que no los perdieras! En conclusion, si decides hacer tu el backface culling es mejor que desactives el backface culling de directx.

Salu2                                

BeRSeRKeR

                                No si realmente yo también lo descarté por lo mismo pero era simplemente por saber si lo que yo hacía era backface culling :riendo:

Ahora bien si ahora llega alguien diciendo que no, que si que se nota el aumento en el rendimiento (por que lo ha comprobado) pues entonces habrá que revisar las cosas...

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

Drácula

                                No entiendo bien a Turrican. ¿Dices que el BFC será más rápido si tienes una GPU? Yo creo que no.

Y pensad como funciona una tarjeta:Coge los vértices, los convierte, y empieza a dibujar triángulos. Pero antes de dibujar el triángulo comprueba el BFC...¡a nivel 2D!

Por ello si no eliminas vértices, el BFC no sirve para nada.

Atención:¡esta es la conclusión a la que llegué después de mucho probar y optimizar! Si alguien no está deacuerdo...¡que comparta sus conocimientos con nosotros!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

BeRSeRKeR

                                Si, creo que es necesario diferenciar entre el backface culling 2D (el que hace OpenGL o Direct3D) y el back face culling que se hace en coordenadas de mundo...                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

turrican

                                Bueno, yo creo que el tema es el siguiente:
El backface culling no me caber duda de que se pueda hacer 2d, seguro que si, pero que yo sepa directx lo hacer 3d. Esto es asi porque al hacerlo tiene que contar con las coordenadas de textura que tienen perspectiva. Una vez en 2d la perspectiva se ha perdido y no es tan facil extrapolar. Esto no pasa con el vertex color que no utiliza perspectiva. No se si me estoy explicando muy bien...
Bueno, el caso es que si tienes el backface culling activado y le pasas a directx vertices ya transformados, este transformara inversamente tus poligonos a coordenadas de mundo (matriz inversa de view*matrix) para testear el backface culling, lo cuel no parece demasiado bueno verdad...
Por eso no es nada bueno tener el backfce culling activado si le pasas caras ya transformadas. Para eso es mejor que hagas el backface culling tu a mano antes.
Otro cantar bien distinto es si tu le pasas a directx caras sin transformar. en este caso el testeara el backface culling antes de transformarlas.

Bueno creo que no se me olvida nada. No se si me explicado bien...
Esta es mi humilde opinion sobre el tema, pero por supuesto no estoy en posesion de la verdad absoluta y me encantaria leer otras opiniones.

Salu22                                

Drácula

                                Turrican:
Me parece que estás equivocado. DX NO hace BFC en 3D. Y el culling que tu dices que se indica, es para que él sepa la dirección del culling y si realmente quieres hacerlo.

El hardware sólo puedo resolverlo en 2D y nunca en 3D, puesto que no tiene ni idea de la matriz de la cámara, aunque haya una GPU!!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

_Grey

                                Igual peko de tonto... pero despues de leer el 3 msg de Dracula de este post... tengo la impresion de que no ganas velocidad por que dibujas esas caras que no tienes que dibujar por que otras caras usan sus mismos vertices?? y lo dejo en interrogacion por que realmente no se entiende muy bien lo que decias, pero no sera eso??

Cambiando de tema la eliminacion de las caras en 2d....... o tampoco os he entendido o.... es perfectamente factible, de echo se hacia hace tiempo ,pero no salia bien... por que no lo aplicaban bien..... o me e echo un lio al leeros(DIOS ESPERO QUE NO SEA ESO!).

Saludos.                                

Emotion

                                para Dracula:

BACK VERTEX CULLING??? eso no existe!!

lo que tu dices se parece un poco al calculo de Phong para pixeles, donde se obtiene un vector normal por pixel (o en tu caso por vertice), lo que pasa es que si se hiciera como tu dices y en vez de tener 3 vertices para formar una cara tienes 2 (imagina que segun tu esquema desechas un vertice) obtendrias una linea, no un triangulo.

Por otro lado, tal y como dice BeRSeRKeR, el backface culling no es mas que examinar el valor del coseno del angulo que forman el vector de direccion de la camara y la direccion del vector normal de la cara que se examina. Me parece que no entendiste bien el concepto del backface culling...

No obstante, me parece que no tienes bien diseñado tu motor (o una parte de el), ya que si tienes problemas con el backface culling es que tu motor anda muy suelto en la pipeline. deberias mirarlo...

Normalmente el BackFace culling te quita entre un 30% y un 40% de los poligonos de la escena, y si lo combinas con el frustum adecuado, ganas un poco mas.

Como ya dije en otro mensaje (aunque no en este topic), el esquema ideal de procesamiento geometrico es:

INPUT > VSD > HSR > VS > OUTPUT

El backface culling, logicamente, esta en la fase HSR (Hidden Surface Removal)

Saludos
_________________
Julio Meca
ALPHA SOFTWARE

[ Este Mensaje fue editado por: Emotion el 2002-03-21 09:22 ]                                
G3: Get the Power!

Drácula

                                A ver, me gustaría deciros que SE PERFECTAMENTE lo que es el BACK FACE CULLING y como expliqué un poco más arriba, LO ESTUDIE DETENIDAMENTE E IMPLEMENTE DIFERENTES OPCIONES. La verdad es que es difícil expresarse usando sólo texto y algunas veces se da pie a cierta confusión.
Y ahora Julio, si dices que ahorras muchísimo tiempo, me gustaría que me explicaras el algoritmo que utilizas para ahorrar tanto tiempo, porque yo HE PROBADO MUCHOS Y CON NINGUNO HE GANADO TIEMPO.
¿a ver si los que perdeis fps sois vosotros porque utilizais BFC?
¡Atención, sólo estoy compartiendo mis conocimientos con vosotros! No me gustaría que nadie se molestase. Estos mensajes los he puesto porque CREO que os equivocais, y como yo lo estudié mucho, me gujstaría ayudaros(o que me ayudeis vosotros diciendo DONDE me equivoqué yo!)
Pensad que mi motor es MUY MUY rápido, comparado con otros motores que existían en la scene de características similares. Así que se un poco de lo que hablo...

Y esto del Back Vertex Culling ya lo he explicado un poco más arriba! Por favor, que nadie siga comentando esto....                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Emotion

                                A ver, Dracula:

En primer lugar, no me he molestado. ni mucho menos :sonriendo:

Lo que pasa es que me cuesta entender como es que no ganas nada de velocidad con el BFC, pero tampoco se como lo estas implementando... quiero pensar que lo estas haciendo por hardware, pero si no es asi, no tiene lugar esta discusion. Por otra parte, el codigo que yo uso para el BFC es tan sencillo como escribir 2 lineas de codigo:

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);

El resto lo hace el hardware, ya que yo, para esos menesteres, ni me molesto en implementarlo en software... Seria muy lento y mi motor no tendra opcion de render por software.

Espero que con esto se disuelvan todos los humos... :sonriendo:

Saludos y, en caso de haberte ofendido, Disculpas
                               
G3: Get the Power!






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.