Renderowanie wokselowe to metoda generowania obrazów 3D, w której przestrzeń jest reprezentowana przez siatkę regularnych sześcianów — wokseli (ang. voxels, skrót od volumetric pixels). W odróżnieniu od tradycyjnego rasteryzmu operującego na siatkach trójkątów, podejście wokselowe przechowuje dane o całej objętości sceny, co otwiera szereg możliwości niedostępnych w geometrii powierzchni.
Ray Casting — podstawy renderowania wokselowego
Ray casting to najstarsza i koncepcyjnie najprostsza technika renderowania wokselowego. Dla każdego piksela obrazu wynikowego rzucany jest promień ze źródła kamery w kierunku sceny. Promień przesuwa się przez siatkę wokseli, próbkując wartości w regularnych odstępach lub w momentach wejścia do kolejnych komórek siatki.
Algorytm DDA (Digital Differential Analyzer) jest standardową metodą śledzenia promienia przez siatkę — efektywnie oblicza odległości do kolejnych granic komórek bez potrzeby kosztownych operacji trygonometrycznych. John Amanatides i Andrew Woo opisali tę metodę szczegółowo w artykule A Fast Voxel Traversal Algorithm for Ray Tracing (1987), który pozostaje podstawowym odniesieniem w implementacjach voxel ray castingu.
W klasycznej implementacji bez oświetlenia, renderowanie wokselowe przez ray casting ma złożoność O(n) w stosunku do długości osi siatki — co przy siatkach 512³ i wyżej staje się obliczeniowo intensywne. Stąd konieczność struktur przyspieszających.
Sparse Voxel Octree — hierarchia w przestrzeni
Pełna siatka wokseli ma kubiczną złożoność pamięciową: siatka 1024³ wokseli przy 4 bajtach na woksel wymaga 4 GB pamięci. Sparse Voxel Octree (SVO) rozwiązuje ten problem przez hierarchiczne dzielenie przestrzeni i przechowywanie tylko niezerowych liści drzewa.
W strukturze octree każdy węzeł może być podzielony na 8 dzieci (stąd nazwa). Puste obszary przestrzeni zajmują tylko jeden węzeł bez dzieci, niezależnie od głębokości hierarchii. Dla typowych scen, gdzie duże obszary są puste, SVO osiąga oszczędność pamięci rzędu 90–99% w porównaniu do pełnej siatki.
NVIDIA opublikowała w 2010 roku artykuł Efficient Sparse Voxel Octrees (Laine, Karras), opisując implementację SVO zoptymalizowaną pod GPU z akceleracją CUDA. Implementacja ta pozwoliła na renderowanie scen wokselowych w czasie zbliżonym do rzeczywistego na ówczesnych kartach GTX 480.
Ray Marching i Signed Distance Fields
Ray marching to technika renderowania oparta na iteracyjnym przesuwaniu promienia wzdłuż jego kierunku. W odróżnieniu od ray castingu, krok przesunięcia nie jest stały — jest wyznaczany przez funkcję odległości (Signed Distance Field, SDF), która dla każdego punktu w przestrzeni zwraca odległość do najbliższej powierzchni.
Wartość SDF dodatnia oznacza, że punkt jest na zewnątrz obiektu, ujemna — wewnątrz, zerowa — na powierzchni. Promień może bezpiecznie przesunąć się o wartość SDF w danym punkcie bez ryzyka pominięcia powierzchni. Ta obserwacja — znana jako sphere tracing (John C. Hart, 1994) — czyni ray marching efektywnym dla złożonych i proceduralnie generowanych kształtów.
SDF jest podstawą renderowania w shaderach GLSL/HLSL bez tradycyjnej geometrii. Shadery opisujące sceny wyłącznie przez funkcje odległości są powszechne w demoscenie i na platformach jak Shadertoy (shadertoy.com).
Techniki hybrydowe
Nowoczesne silniki graficzne często łączą rendering wokselowy z rasteryzmem. NVIDIA Voxel Global Illumination (VXGI), wprowadzone w Unreal Engine 4, używa wokseli do symulacji oświetlenia globalnego — scena jest wokselizowana w czasie rzeczywistym, a następnie używana do obliczania cone tracing dla ambient occlusion i indirect lighting.
VXGI — schemat działania
- Scena jest renderowana rasteryzmem do G-buffera (pozycja, normalna, albedo)
- Geometria jest wokselizowana do siatki 3D (zwykle 128³ lub 256³)
- Woksele przechowują dane o radiancji i zasłonięciu
- Cone tracing przez strukturę wokselową aproksymuje oświetlenie pośrednie
Podejście hybrydowe pozwala zachować wydajność rasteryzmu dla geometrii przy jednoczesnym korzystaniu z fizycznie bardziej poprawnego oświetlenia globalnego z reprezentacji wokselowej.
Renderowanie wolumetryczne
Rendering wolumetryczny (ang. volume rendering) to technika wizualizacji trójwymiarowych danych skalaru — gęstości, temperatury, wilgotności. Stosowana w medycynie (wizualizacja CT i MRI), meteorologii i VFX.
Algorytm ray casting dla danych wolumetrycznych próbkuje wartości skalara wzdłuż promienia i akumuluje kolor oraz przezroczystość przez tzw. compositing. Dwie główne metody:
- Maximum Intensity Projection (MIP): Wyświetla najwyższą wartość skalara wzdłuż każdego promienia. Używana w angiografii CT do wizualizacji naczyń krwionośnych.
- Alpha compositing (front-to-back): Akumuluje kolor i przezroczystość od przodu do tyłu sceny, symulując semi-transparentne media jak dym czy mgła.
Format OpenVDB, opracowany przez DreamWorks Animation i udostępniony open-source w 2012 roku, stał się standardem branżowym do przechowywania danych wolumetrycznych VFX. Blender, Houdini i Nuke obsługują natywnie import i export .vdb.
Zastosowania renderowania wokselowego
Renderowanie wokselowe ma zastosowania w wielu dziedzinach:
- Gry wideo: Minecraft używa renderowania wokselowego jako modelu rozgrywki (nie jako metody graficznej). Gry jak 7 Days to Die, Teardown i Space Engineers używają pełnych silników wokselowych umożliwiających destrukcję terenu.
- VFX filmowe: Efekty ognia, dymu, chmur w filmach animowanych (Pixar, DreamWorks) są generowane jako wolumeny i renderowane przez silniki jak RenderMan (Pixar) lub Arnold (Autodesk).
- Wizualizacja medyczna: Tomografia komputerowa i MRI produkują trójwymiarowe siatki wokseli. Programy ITK-SNAP i 3D Slicer pozwalają na wolumetryczną wizualizację danych klinicznych.
- Architektura i GIS: Dane LiDAR z sensorów laserowych (drony, samochody LIDAR) są przechowywane i wizualizowane jako chmury punktów lub woksele w programach jak CloudCompare i QGIS.
Zasoby techniczne: Specyfikacja i kod źródłowy OpenVDB są dostępne pod adresem openvdb.org. Dokumentacja algorytmu Amanatidesa-Woo dostępna w IEEE Computer Graphics and Applications (Vol. 7, 1987).