Directx11 compta
amb la quantitat més elevada de tipus de shaders
des de que es va crear l’HLSL. Tots apliquen transformacions diferents als
objectes renderitzats. Actualment es compta amb 4 shaders, dels quals un conté tres etapes (dos d’elles programables),
de manera que es podria dir que són 5 el
total del que es disposa.
A continuació se’n
descriuen les funcions principals de cadascun.
7.3.1. Vertex Shader
El vertex shader és un petit programa
escrit bàsicament per a la transformació de vèrtexs, dels que estan
emmagatzemats al vèrtex buffer, a l’espai 3D. També és possible fer altres
càlculs com per exemple calcular les normals per cada vèrtex. El vertex shader és cridat per la Graphics
Processing Unit (GPU), és a dir pel processador de gràfics de l’ordinador, per cada vèrtex que es necessita processar. Per exemple,
per un model de 5000 polígons, el vertex
shader es processarà 15000 cops per
cada frame. I si el nostre programa
es renderitza a 60fps aquest cridarà al vertex
shader 900000 cops per segon, per
dibuixar només 5000 triangles. De manera que és important escriure vertex shaders eficients.
7.3.2. Pixel Shader
El Pixel shader és un petit programa escrit
en un fitxer a part del codi general del programa que permet pintar els
polígons que dibuixem a l’espai 3D. Són executats per la GPU per cada píxel
visible que es dibuixa a la pantalla. Pintar, col·locar textura, aplicar
il·luminació, entre molts d’altres efectes amb les cares dels polígons, són
programats al pixel shader. A l’igual
que els vertexs shaders, han de ser
eficientment programats degut al gran nombre de cops que són executats per la
GPU.
7.3.3. Geometry Shader
El Geometry shader és un petit programa
escrit en un fitxer a part del codi general del programa que permet tractar les
dades a nivell de primitiva i no a nivell de vèrtex com ho faria el vertex shader, comentat anteriorment. El
vertex shader dóna accés a un vèrtex cada cop que
s’executa, mentre que el geometry shader
dóna accés als 3 vèrtexs d’un triangle com a paràmetres d’entrada, és a dir a
la geometria del triangle, directament. Aquest shader és capaç de modificar els vèrtexs, afegir més vèrtexs (fer més
triangles), o simplement descartar el triangle sencer. És un shader relativament nou, més nou que el vertex shader i el pixel shader, però més antic que el Hull shader i el Domain
shader, nous a Directx11. Obre un nou ventall de possibilitats ja que
permet editar la geometria d’una manera més ràpida i alhora permet modificar la
geometria d’una manera que abans no era possible o requeria algoritmes molt
pesats i complicats.
7.3.4. Tesselation (Mosaic)
El procés de tessellation és nou des de la versió de
Directx11. La paraula tessellation,
que es podria traduir directament com mosaic, es refereix a subdividir una
superfície mitjançant petites superfícies, tal i com es construeix un mosaic.
Així doncs, permet augmentar la resolució a partir de noves subdivisions fins a
un màxim de 2048 per primitiva. Això permet fer efectes molt espectaculars com per
exemple pell ultra-realista, o fer més eficaces d’altres tècniques com el displacement mapping al
combinar-les. A més a més, permet treballar amb superfícies amb pocs polígons i
renderitzar-les en alta definició (molts polígons) permetent accelerar els
càlculs a baix nivell i, per tant, millorar el rendiment del programa.
Figura 1. Augment del detall d'una imatge generada mitjançant gràfics per ordinador gràcies al procés de Tesselation.
El procés té tres etapes, la del
Hull
shader, l’etapa Tessellation i la del Domain
shader.
Figura 2. Esquema que mostra els tres etapes de Tesselation. El procés comença amb un objecte a baix nivell de poligos, a continuació aquest es subdivideix en triables connectats entre ells dels quals se'n fan mostres que se'ls apliquen efectes. Finalment es destaguen els vèrtexa que corresponen a les mostres modificades.
Els avantatges
principals del procés de tessellation
per hardware implementat a DirectX són els següents:
- Estalvi de memòria i ample de banda. És possible renderitzar models o objectes d’alta resolució a partir de models o objectes de baixa resolució. Això s’accentua si es combina amb els mapes de desplaçament.
- Suport per tècniques de renderitzat escalable. D’aquesta manera els càlculs dels renderitzats es calculen en temps d’execució.
- Millora del rendiment. Gràcies a que els càlculs es realitzen en models de baixa resolució, se’n veu beneficiat el rendiment. Això pot incloure també càlculs per una animació o càlculs de físiques per la detecció de col·lisions, entre d’altres. Treballar en models de baixa resolució accelera els càlculs.
A continuació
s’expliquen cadascuna etapes del procés de tessellation
amb més detall.
7.3.4.1. Hull Shader
El hull shader és la primera de les
tres etapes que treballen conjuntament per implementar tessellation.
És invocada un cop per cada pedaç. Un pedaç és un conjunt de punts de control
utilitzats per crear una malla, no són triangles. El Hull Shader transforma els punts de
control que defineixen una superfície en punts de control que defineixen un
pedaç. També realitza una sèrie de càlculs per pedaç per a proporcionar dades a
l’etapa tessellation i a l’etapa de Domain shader. És una etapa programable
que produeix com a sortides els punts de control dels pedaços i les seves
constants.
A més a més té les següents
propietats:
- L’entrada és d’entre 1 i 32 punts de control.
- La sortida també és d’entre 1 i 32 punts de control. Aquests punts de control poden ser utilitzats per l’etapa de Domain shader. Les constants dels pedaços poden ser utilitzats poden ser utilitzats també pel Domain shader.
- El factor de tessellation determina quan es subdividirà cada zona.
- El Hull Shader declara l’estat demanat a l’etapa de tessellation. Això inclou informació com el número de punts de control, el tipus de la cara del pedaç i el tipus de subdivisió. Aquesta informació apareix normalment com a declaracions al principi del codi del shader.
- Si el Hull Shader estableix cada factor de la vora a < o = a 0, o a NaN, la zona serà sacrificada (no es subdividirà i s’anul·larà). Com a resultat d’això, l’etapa de tessellation pot o no pot executar-se, i el Hull shader no s’executarà i no es produirà una sortida visible per aquesta zona.
- La fase de punt de control del Hull Shader treballa un cop per cada punt de control, llegint els punts de control d’un pedaç i generant una sortida de punt de control identificada per un ControlPointID.
- La fase de la constant d’un pedaç treballa un cop per pedaç per generar els factors de la vora del tessellation i altres constants per pedaç. Internament algunes constants de pedaç poden executar-se alhora. La fase de la constant d’un pedaç té accés de només lectura a totes les entrades i sortides de punts de control.
A l’apartat
d’exemples de shaders s’explica com dissenyar i crear un Hull shader.
7.3.4.2. Etapa Tesselation
L’etapa de tessellation és la segona etapa del
procés amb el mateix nom, Tessellation.
Aquesta etapa no és programable a diferència de les altres dues (Hull shader i Domain shader).
L’etapa de tessellation s’encarrega de transformar
el pedaç d’un model, en geometria contenidora de molta informació programable.
En general aquesta nova geometria es representa en una quantitat elevada de
triangles que detallen més la superfície. Subdivideix un domini de quatre, tres
o una línia, en molts objectes més petits com triangles, punts o línies.
Aquesta etapa
s’executa un cop per cada pedaç usant els factors de tessellation i el tipus de partició que ha rebut des del Hull Shader. Extreu com a sortides unes
coordenades UV (i opcionalment W) i de la topologia de la superfície per a l’etapa de Domain Shader.
Internament aquesta
etapa funciona en dues fases:
- La primera fase processa els factors de tessellation solucionant problemes d’arrodoniment, reduint i combinant informació irrellevant.
- La segona fase genera punts o llistes de topologies basades en el tipus de partició seleccionat. Aquest és el nucli principal d’aquesta etapa.
S’inicialitza un
cop queda inicialitzada l’etapa Hull
shader i es nodreix dels outputs d’aquest shader. Les seves sortides d’informació són inputs per al domain shader.
7.3.4.3. Domain Shader
El domain shader és la tercera i última
etapa de Tessellation. És
l’encarregat de calcular la posició del vèrtex d’un punt de control d’un pedaç
ja subdividit, és a dir converteix les dades de les anteriors dues etapes en
dades de posicionament normals. Les propietats d’aquest shader inclouen:
- El Domain shader és invocat un cop per cada coordenada de sortida de l’etapa tessellation.
- El Domain Shader consumeix punts de control de sortida del Hull Shader.
- El Domain Shader produeix com a sortida de la posició d’un vèrtex.
És possible usar la
sortida per passar-la al píxel shader.
En aquest cas, cal incloure també la posició del punt.


No hay comentarios:
Publicar un comentario