Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Curiosa Técnica En Los Ps 3.0

Iniciado por Thenend, 11 de Mayo de 2004, 05:55:41 PM

« anterior - próximo »

Thenend

 Estaba mirando las características de los vertex shader 3.0 y me ha llamado la atención una tecnica muy curiosa. Os pongo un cacho de este artículo por si os interesa:


CitarAnother key feature of Shader Model 3.0 is the support for the Microsoft DirectX® Instancing API.  Currently, games face limits on the number of unique objects they can display in the scene, not because of graphics horsepower, but often the CPU-side overhead of either storing or submitting many slightly different variations of the same object.  For instance, a forest is made up of trees that are often similar to each other, but each would be in a different position, have differing height, branch length, leaf color, and so on.  In order to add the desired variation, developers have to choose between storing many separate copies of the tree, each slightly different, or making expensive render state changes in order to rotate, scale, color and place each tree.


Instancing allows the programmer to store a single tree, and then several other vertex data streams to specify the per-instance color, height, branch size and so on.  For instance, a single 1000-vertex tree model would contain the vertex positions and normals, and a 200-element vertex streams would contain positions, colors, heights, and branch length values.  Instancing allows the programmer to submit a single draw call, which renders each of the 200 trees, using the same data for the basic tree shape, but then vary it through the per-instance streams.

Es una forma interesante de ahorrar ancho de banda y CPU ¿no?


Edit: he puesto PS en el titulo pero es de los VS que me he eqibocao:-p

AgeR

 No entiendo mucho de estas cosas pero... sería algo parecido a las display lists de OpenGL? Vamos, parecido pero a lo bestia... pudiendo modificar el modelo original en tiempo real... no?  :ph34r:

Pues está bien eso... tendré que ir empollandome esto de los VS & PS de una vez  :huh:

Saludos!

Haddd

 Instanciar sólo elimina memoria de geometría, pero carga mucho más al shader. No me parece una buena idea, hoy en día que la RAM es barata

Mars Attacks

 Espero que te refieras al tiempo de acceso o que me regales un par de módulos de 256 :D

Thenend

 La verdad es que ahora que la tarjeta que menos memoria tiene es de 128 MB, la geometría parece que no ocupe nada

32 bytes cada vertice * 2000 vertices el modelo * 200 modelos = 12.800.000 bytes

Y con eso estarías mostrando 400.000 vertices que ya esta bien.

Claro que a una consola que tiene 32 o 64MB como mucho para todo, igual si le vendría bien el ahorro.

Si usas unos parámetros para modificar, por ejemplo, la curvatura de los árboles de manera que se inclinen según les pegue el viento, los vértices se modificarán, por lo que tendrás que reenviarlos en cada frame, y ahorrar 12 megas de ancho de banda no está nada mal. Y encima te lo calcula la GPU.

Otra cosa que te ahorras son las 200 llamadas a DrawPrimitive. Y si tienes un ejército de 2000 unidades de infantería pues 2000 llamadas que te ahorras.

Supongo que tendrá sus ventajas y desventajas, como todo, habrá que saber donde usarlo.

Haddd

 
CitarSi usas unos parámetros para modificar, por ejemplo, la curvatura de los árboles de manera que se inclinen según les pegue el viento, los vértices se modificarán, por lo que tendrás que reenviarlos en cada frame, y ahorrar 12 megas de ancho de banda no está nada mal. Y encima te lo calcula la GPU.

Eso es falso. Tendrás que reenviarlos igual. Peor, porque en el shader vas a tener que hacer búsquedas e irá más lento.

La única ventaja es el ahorro de memoria, pero vamos no creo que nadie utilice esta técnica. Y el ejemplo de los árboles es un poco tonto, porque precisamente se necesita tener varias versiones del mismo árbol según la distancia, así que ya me dirás para que quieres las instancias.

Álgo que sería muy ventajoso es que pudieras lanzar el mismo objeto muchas veces y diferentes constantes. Esto permitiría, por ejemplo, lanzar 10 personajes iguales de una tacada. Qúizás se refiera a esto Ms al hablar de instancias.

Thenend

 
CitarÁlgo que sería muy ventajoso es que pudieras lanzar el mismo objeto muchas veces y diferentes constantes. Esto permitiría, por ejemplo, lanzar 10 personajes iguales de una tacada. Qúizás se refiera a esto Ms al hablar de instancias.

Para eso es precisamente para lo que vale  (ole)

Mira, aquí lo explican mejor, que igual el artículo de antes no lo explicaba muy claramente.

No se reenvía ningún vertice y el shader no hace búsquedas  :blink:  porque procesa cada instancia con sus constantes desde el VS. Se combina la geometría y tal de una sola copia con las constantes independientes para cada instancia.

En lo que sí que le has dado es en lo de los diferentes niveles de poligonización según la distancia. Habría que tener una instancia para cada nivel e intercambiar de vez en cuando algunas constantes de la lista. Entonces si que habría que hacer búsquedas para encontrar los modelos que están en una distancia de cambio y mover sus constantes de una lista a otra  <_<  mmm, lo mismo que se haría si no usaras instancias. Y ahí te ahorrarías aún mas memoria al no tener que almacenar todos los niveles de poligonización para cada arbol distinto, bueno, arbol, unidad de infantería, brizna de yerba, partícula, oveja o lo que sea.

Haddd

 Bien, lo único que te ahorras es tener que hacer varios DrawIndexedPrimitive. Pero como tengas que cambiar de textura o de shader, lo llevas crudo.

Me parece una optimización ingenua. No creo que ahora un desarrollador de juegos se ponga a utilizar instancias. Es limitar, y lo que menos se necesita ahora son limitaciones. Deberían centrarse en eliminar las limitaciones que ahora existen. Por ejemplo, una buena idea es la técnica de ATI de comprimir las normales. Con eso se gana, y mucho. Deberían hacer lo mismo para los otros vértices, que no se tenga que hacer por shader.

Ya veremos con que nos sorprende DX9.0c.  :blink:

Thenend

 No es por fastidiar (bueno si  :P ) pero así buscando un poco si algún desarrollador comentaba algo, he encontrado que SpeedTree, una tecnología que usa la capacidad de instanciacion de los VS 3.0 ha sido integrada en el nuevo motor de Unreal. Y los de FarCry parece que también están interesados en la técnica.

No se, no le veo que sea una cosa tan horrible, si el cuello de botella está en el bus y esta técnica te ahorra bus, pues bienvenida sea.

Supongo que soy muy nuevo en los shaders y no tengo la perspectiva muy clara.

Thenend

 Juas, olvídate de Epic, hay una compañía mucho mejor que usa el SpeedTree. NOVARAMA  :D . Daniel Sanchez Crespo hizo la review para Gamasutra.

Haddd

 Tendremos que esperar a saber un poco más.... :D  

Zaelsius

 
Cita de: "Haddd"Bien, lo único que te ahorras es tener que hacer varios DrawIndexedPrimitive.
Aunque sólo fuese por eso ya sería bueno, porque desde que llamas a Draw[..] hasta que le llega a la tarjeta la orden se atraviesan unas cuantas capas, dx, com, driver, etc.. justo lo que hace que DX sea de entrada(sin optimizar) algo más lento que GL al tirar polígonos: P.

Supongo que esta técnica será más adecuada para sistemas de partículas(misma textura casi siempre), grandes conjuntos de objetos similares(árboles, hierba, casquillos de bala), etc.

BeRSeRKeR

 Ha aparecido una entrevista al CEO de Crytek sobre el Shader Model 3.0.

La conclusión que se puede sacar es que la ventaja de los V&P shaders 3.0 sobre los 2.0 es en términos de rendimiento y no de calidad de imagen. O sea que el modelo 3.0 es capaz de ejecutar los mismos shaders más rápido que los 2.0. La razón viene dada en forma de lista en la entrevista que he mencionado. Uno de los puntos de esa lista es precisamente el tema de instanciar geometría.

Por cierto, no son listos estos de nVidia. Si os fijáis en las imágenes que se comparan, veréis que entre unas y otras hay unas diferencias en términos de calidad de imagen bestiales. Lo normal es pensar que las comparaciones serían entre imágenes generadas con 3.0 y 2.0. Pues no, se ve que nVidia forzó a los de Crytek a mostrar imágenes generadas con shaders v1.x vs shaders v3.0. Por algo será, ¿no?. Vergonzoso... :lol:

Y eso no es todo. En las supuestas imágenes generadas por shaders 3.0, la mayoría de los objetos que la forman utilizan shaders 2.0. Sólo utilizan 3.0 allá donde su uso aumenta el rendimiento. :)

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.