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 ID3D11RasterizerState
ID3D11RasterizerState * rasterState;
D3D11_RASTERIZER_DESC rasterizerState;
rasterizerState.FillMode = D3D11_FILL_SOLID;
rasterizerState.CullMode = D3D11_CULL_FRONT;
rasterizerState.FrontCounterClockwise = true;
rasterizerState.DepthBias = 0;
rasterizerState.DepthBiasClamp = 0;
rasterizerState.SlopeScaledDepthBias = 0;
rasterizerState.DepthClipEnable = true;
rasterizerState.ScissorEnable = true;
rasterizerState.MultisampleEnable = false;
rasterizerState.AntialiasedLineEnable = false;
HRESULT hr = device->CreateRasterizerState( &rasterizerState, &rasterState);
Queste istruzioni creano un rasterizerState che passate al deviceContext tramite istruzione RSSetState
deviceContext->RSSetState(rasterState);
Passando NULL il settaggio tornerà al default di Direct3D11
deviceContext->RSSetState(NULL);
Come potete vedere il rasterizer viene inizializzato impostando i vari valori (nel nostro caso il fillmode è stato impostato come solid). Le variabili non impostate saranno valorizzate con il valore di default. I campi da utilizzare sono i sequenti
- 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).
- FRONTCOUNTERCLOCKWISE : 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)
- ZCLIPENABLE : 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).
- SCISSORENABLE : attiva gli scissor, rettangoli che impediscono il rendering dei pixel fuori di essi.
- MULTISAMPLEENABLE : attiva il multisample (per utilizzare l’antialiasing, richiede una superficie creata con multisample attivato)
- ANTIALIASEDLINEENABLE : 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 RSSetScissorRects, che permette di passare n rettangoli. In questo caso ne è stato passato solo 1 che limiterà a 640 x 480 la scena.
D3D11_RECT rects[1];
rects[0].left = 0;
rects[0].right = 640;
rects[0].top = 0;
rects[0].bottom = 480;
deviceContext->RSSetScissorRects( 1, rects );