2013-02-16 14 views
13

Ho recentemente implementato ombre morbide utilizzando tracciamento cono voxel in OpenGL 4.3 tracciando un cono nella direzione della luce e accumulando valori di opacità. enter image description hereVoxel Cone Tracing Soft Shadows

La cosa fondamentale che sto cercando di risolvere o nascondere è l'effetto molto voxelized shadowing come la superficie occluso si avvicina al occlusore, così come nascondere le macchie chiare in ombra a causa di voxelization superficie. Sto usando voxels a bassa risoluzione 64x64x64; tuttavia, anche se utilizzo voxel ad alta risoluzione, alcuni dei voxel a bassa risoluzione a un livello di mip-map più alto vengono comunque catturati nella traccia.

Ecco la mia prima idea: voglio essere in grado di mantenere le parti più morbide dell'ombra più lontana e sostituire le parti dell'ombra più vicine all'occluder con una mappa delle ombre. La mappa delle ombre svanirà in quanto è più lontana da ciascun occlusore e in qualche modo la mescolerò con le ombre tracciate con cono.

enter image description here

qualcuno può pensare a un modo per sfumare l'ombra di distanza in base alla distanza da ogni oggetto per l'ombra-mappa e quindi far si fondono in maniera armoniosa nella ombra cono-tracciato?

Un'altra idea che avrei sarebbe quella di tracciare ombre in qualche modo su superfici che sono più vicine a un occlusore, ma probabilmente sarebbe troppo costoso.

In alternativa, darei il benvenuto a qualsiasi altra idea per migliorare l'algoritmo di ombreggiatura sfumata.

ho anche messo su un video per mostrare in moto:

https://www.youtube.com/watch?v=SUiUlRojBpM

non hanno ancora trovato un modo per risolvere il problema shadowing.

+1

+1 - finalmente una domanda, non è a livello di principiante e mi fa solleticare il cervello :) Fammi vedere cosa posso pensare ... – datenwolf

+1

Nell'algoritmo del cono traccia, usi il valore alfa del voxel per indicare se il voxel è occupato o no? In tal caso, l'algoritmo di mipmapping predefinito in opengl potrebbe non fornire risultati corretti. Inoltre stai usando una rappresentazione sparsa del voxel octree? – Slicedpan

+0

Per la diffusione indiretta e speculare, campionamento della trama 3D mediante offset in tutte le 6 direzioni di 1 voxel - per ogni livello di mip. Immagino che questo mi dia 2x2x2 "mattoni", se ho capito bene la teoria. Traccio il cono fino a quando il valore di opacità diventa 1 e raggiunge la mia massima distanza definita. Ho notato che il mipmapping di default non è molto fluido, quindi credo che i miei risultati dovrebbero migliorare se avessi usato i mattoncini 3x3x3 - con un costo leggermente più alto delle prestazioni? Non sto usando una struttura ad otto, ma questo è nella lista delle cose da implementare. – gboxentertainment

risposta

0

Bene, in questo caso puoi farlo aggiungendo più luci. Puoi aggiungere più luci più vicine a quelle originali e poi comporre l'ombra di una luce con le ombre di un gruppo di luci più vicine. Questo è l'effetto "area light".

2

Sto indovinando che gli artefatti "clear spot" si verificano a causa delle ampie dimensioni del voxel che sono parzialmente riempite di geometria: "accumulo di valori di opacità". Quanti campioni stai prendendo durante la conversione da pixel rasterizzati a voxel? Se il volume del campione/volume del voxel è piccolo, potrebbero esserci problemi con la trasparenza della resa corretta: il rumore sarà indicato dalle aree più chiare.

Inoltre, la direzione della trasparenza del tuo voxel dipende? Based on the author's original paper. La dipendenza direzionale è importante per garantire che i voxel semi-opachi siano resi correttamente.

A quick picture to explain

"per un'ombra-mappa e quindi far si fondono in maniera armoniosa nella ombra cono-tracciato?"

Sembra che tu sia come spararti ai piedi. Ottieni un risultato di prestazioni ancora più grande e ottieni gli svantaggi sia del tracciamento shadow che del cono del voxel. Il tracciamento del cono Voxel è costoso ma può dare belle ombre morbide e fare illuminazione globale. La mappatura delle ombre è migliore per creare ombre dure ed è più veloce per le scene più piccole, ma man mano che si aggiunge più geometria si finisce per ridisegnare le stesse cose più volte, almeno una volta per ogni luce.

Ottimo lavoro tra.Mi sono imbattuto nel tuo problema mentre facevo ricerche preliminari per la mia implementazione DirectX del tracciamento cono voxel.

[Edit]

mi sono reso conto che ho fatto un errore di battitura nella foto. L'immagine a destra dovrebbe essere 4/64, anziché 4/16. Ho dimenticato la dimensione Z.

+0

Felice di vedere altri ppl che lavorano anche a questa tecnica. Non sto usando la trasparenza dipendente dalla direzione. Inizialmente avevo pianificato di sostituire la mia voxelizzazione superficiale con una voxelizzazione solida che dovrebbe eliminare i buchi ed eliminare i riflessi speculari "cavi" (cioè le mie riflessioni speculari sono trasparenti a causa della miscelazione semi-trasparente dei voxel). La mia paura di usare voxel direzionali dipendenti è che costerebbe molto più dell'utilizzo di voxelization solido. – gboxentertainment