# Determinazione della superficie nascosta

Nella computer grafica 3D, la determinazione della superficie nascosta (conosciuta anche come hidden surface removal (HSR), occlusion culling (OC) o visible surface determination (VSD)) è il processo utilizzato per determinare quali superfici e zone di superficie non sono visibili da un certo punto di vista. Un algoritmo di determinazione della superficie nascosta è la soluzione al problema della visibilità, che è stato uno dei problemi più importanti nel campo della computer grafica 3D. Il processo di determinazione della superficie nascosta è a volte chiamato hiding, e così un algoritmo è a volte chiamato hider. L'analogo per il rendering delle linee è l'hidden line removal. La determinazione della superficie nascosta è necessaria per renderizzare un'immagine correttamente, cosicché non si possa "guardare attraverso i muri" nella realtà virtuale.

## Aspetti teorici

La determinazione della superfici nascoste è un processo in cui le superfici che non dovrebbero essere visibili all'utente (ad esempio perché si trovano dietro oggetti opachi come pareti) vengono escluse dal processo di rendering. Nonostante i progressi nelle capacità dell'hardware, c'è ancora bisogno di algoritmi di rendering avanzati. La responsabilità di un motore di rendering è quella di permettere per spazi grandi e per spazi la cui dimensione tende all'infinito un rendering a velocità costante, senza rallentamenti. L'ottimizzazione di questo processo si basa sull'essere in grado di assicurare l'utilizzo di pochissime risorse per la rappresentazione di superfici che non devono essere rese visibili all'utente.
Ci sono molte tecniche per la determinazione delle superfici nascoste. Esse sono fondamentalmente un esercizio di ordinamento e di solito variano nella scaletta in cui l'ordinamento è eseguito e come il problema è suddiviso. L'ordinamento di grandi quantità di primitive grafiche è di solito fatto per mezzo del divide et impera.

## Algoritmi

Considerando che gli step di rendering pipeline, proiezione, clipping, e rasterizzazione sono gestiti in modo differente dai seguenti algoritmi:
* Z-buffering: durante la rasterizzazione, il valore profondità/Z di ogni pixel (o sample nel caso dell'anti-aliasing, ma senza perdita di generalità viene utilizzato il termine pixel) viene messo in rapporto a un valore di profondità esistente. Se il pixel corrente è dietro il pixel nello Z-buffer, il pixel viene scartato, altrimenti è ombreggiato e il suo valore di profondità sostituisce quello nello Z-buffer. Lo Z-buffering supporta facilmente le scene dinamiche ed è attualmente implementato il modo efficiente nell'hardware grafico. Questo è lo standard corrente. Il difetto nell'utilizzo dello Z-buffering è che impiega fino a 4 byte per pixel e che l'algoritmo di rasterizzazione deve controllare ogni campione rasterizzato in rapporto allo Z-buffer. Lo Z-buffer può anche soffrire di artefatti a causa di errori di precisione (noti anche come Z-fighting), anche se questo adesso è molto meno comune ora che l'hardware a basso costo supporta buffer di precisione a 24 bit o superiori.
* Coverage buffers (C-buffer) e Surface buffer (S-buffer): più veloci dello Z-buffer e comunemente usati nei giochi dell'era di Quake I. Invece di memorizzare il valore Z per pixel, essi memorizzano l'elenco di segmenti già visualizzati per ogni riga dello schermo. I nuovi poligoni vengono quindi tagliati rispetto ai segmenti già visualizzati che li nascondono. Un S-buffer può mostrare poligoni non ordinati, mentre un C-buffer richiede che i poligoni vengano mostrati dal più vicino al più lontano. Poiché la tecnica del C-buffer non richiede che un pixel venga disegnato più di una volta, il processo è leggermente più veloce. Questo è stato comunemente utilizzato con gli alberi di partizione binaria dello spazio (BSP), che fornirebbero l'ordinamento dei poligoni.
* Sorted Active Edge List: utilizzato in Quake 1, memorizzava un elenco degli spigoli di poligoni già visualizzati (vedi algoritmo scanline). I poligoni vengono visualizzati dal più vicino al più lontano. I nuovi poligoni vengono tagliati rispetto agli spigoli dei poligoni già visualizzati, creando nuovi poligoni per visualizzare, e poi memorizzare, gli spigoli addizionali. È molto più difficile da implementare rispetto agli S/C/Z-buffer, ma scala molto meglio con l'aumento della risoluzione.
* Algoritmo del pittore: ordina i poligoni dal più lontano al più vicino. Questo produce pochi artefatti quando viene applicato alle scene con poligoni di dimensioni simili, formando mesh lisce e attivando il back-face culling. Il difetto qui è lo step di ordinamento e il fatto che possono verificarsi degli artefatti visivi. Questo algoritmo è sconsigliato per progettare scene generali, in quanto non è in grado di gestire poligoni in varie configurazioni comuni.
* Partizione binaria dello spazio (BSP): divide una scena lungo piani corrispondenti ai confini del poligono. La suddivisione è costruita in modo da fornire un ordine di profondità inequivocabile da qualsiasi punto della scena, quando l'albero BSP è attraversato. Lo svantaggio qui è che l'albero BSP viene creato con un pre-processo costoso. Ciò significa che è meno adatto per scene composte da geometria dinamica. Il vantaggio è che i dati sono pre-ordinati e liberi da errori, pronti per l'applicazione degli algoritmi precedentemente menzionati. Si noti che il BSP non è una soluzione per l'HSR, ma solo un aiuto.
* Ray tracing: tenta di modella il tragitto dei raggi di luce ad un punto di vista, tracciando i raggi dal punto di vista alla scena. Sebbene non sia un algoritmo di rimozione della superficie nascosta in quanto tale, risolve implicitamente quel problema trovando la superficie più vicina lungo ciascun raggio di visione. In pratica, questo equivale a ordinare tutta la geometria su base di pixel.
* Algoritmo di Warnock: divide lo schermo in aree più piccole e ordina i triangoli all'interno di queste. Se esistono ambiguità (cioè, i poligoni si sovrappongono in profondità dentro queste aree), si verifica un'ulteriore suddivisione. Al limite, la suddivisione può verificarsi al livello dei pixel.