Rastering 2893 Visite) DirectX 11
Il rastering è il processo che partendo dalla descrizione dei poligoni (in Direct3D solo di tipo triangolare), genera a video i triangoli. Nei precedenti tutorial è già stato spiegato in teoria come funziona il processo: il vertex shader valorizza i vertici, il rasterizer calcola tutti i pixel necessari per riempire il triangolo e per ognuno di questi fa una media pesata tra i 3 vertici in base alla posizione mandando il risultato al pixel shader. I settaggi vengono inseriti in un oggetto RasterizerState
RasterizerStateDescription rasterDescription = RasterizerStateDescription.Default();
_rasterState = new RasterizerState(Device, rasterDescription);
Creato il rasterizzer si passa il tutto al Contex
DeviceContext.Rasterizer.State = _rasterState;
Passando NULL il settaggio tornerà al default di Direct3D11
deviceContext->RSSetState(NULL);
Il RasterizerStateDescription contiene diversi valori da impostare. Il metodo Default genera una configurazione di base ma le opzioni sono varie:
- FillMode : indica come andranno riempite le primitive. Le opzioni sono SOLID (il settaggio di default) che riempie normalmente il triangolo e WIREFRAME che visualizza solamente le linee, lasciando vuoto il centro
- CullMode : specifica se i poligoni saranno invisibili se inquadrati da davanti (FRONT), da dietro (BACK) o in entrambi i casi (NONE).
- IsFrontCounterClockWise : specifica la direzione considerata frontale per i triangoli. Con TRUE il triangolo sarà frontale se i vertici sono disposti in senso antiorario, con false in senso orario
- DepthBias : è un valore intero di profondità che viene aggiunto ai pixel. Su scene molto grandi può capitare che oggetti a profondità molto vicine abbiano degli artefatti dovuti alla limitata precisione dello ZBUFFER. Anche su scene piccole se 2 oggetti hanno la stessa profondità (2 cubi coincidenti ad esempio) si verificherà che in alcuni punti il primo copre il secondo, in altri il secondo copre il primo. Con questo settaggio lo zbuffer viene valorizzato con un valore diverso da quello calcolato e potrete dare priorità agli oggetti.
- DepthBiasClamp : è un float che indica il valore massimo di profondità inseribile sullo Zbuffer. Farà in modo che oggetti oltre una certa distanza abbiano profondità uguale
- SlopeScaledDepthBias : permette di scalare i settaggi del bias (ad esempio lasciare i primi invariati ed usare questo in base alla distanza dalla camera)
- IsDepthClipEnabled : se impostato a True (default) fa in modo che nulla oltre lo ZFAR impostato nella projection matrix sia visibile (un grande risparmio in tempo di elaborazione per oggetti che oltre una certa distanza non sarebbero comunque visibile).
- IsScissorEnabled : attiva gli scissor, rettangoli che impediscono il rendering dei pixel fuori di essi.
- IsMultisampleEnabled: attiva il multisample (per utilizzare l’antialiasing, richiede una superficie creata con multisample attivato)
- IsAntialiasedLineEnabled: attiva il line antialiasing, un sistema che migliora il rendering delle linee. Si può attivare solo se il multisample è impostato a false e l’oggetto è una linelist o linestrip
Per impostare gli scissor si utilizza l’istruzione DeviceContext.Rasterizer.SetScissorRectangles , che permette di passare n rettangoli.
Vi rimando al tutorial numero 6 della serie (Github o in fondo dal primo tutorial)