Kopie des Threads im ZFX unter
http://zfx.info/viewtopic.php?f=5&t=3966
Moin,
ich bastle trotz baldigem Ende immernoch am Voxelprojekt. Da habe ich jetzt ein Problem mit der Beleuchtung. Ich berechne pro Voxel eine Normale anhand der 3^3 bzw. 5^3 umgebenden Voxel. Dabei kommt es immer wieder vor, dass ein Voxel absolut symmetrisch von Nachbarvoxeln umgeben ist, so dass die momentane Normalenberechnung den Nullvektor ergibt. Was ich also eigentlich suche, ist eine erweiterte Normalenberechnung, die irgendwie die Freiheitsgrade zur aktuellen Umgebungssituation ermittelt und irgendwie in die Normale mitkodiert.
Folgende Szenarien sind möglich:
a) der Voxel ist Teil einer ein-voxel-dicken Schicht. Die Normale für diesen Fall ist eigentlich durch die Ebene definiert, kann aber zwei Richtungen sein. Also quasi schlichte doppelseitige Beleuchtung.
b) der Voxel ist Teil einer ein-voxel-dicken Strecke. Die Normale ist also nur als Senkrechte auf dieser Strecke festgelegt, kann aber frei um diese Achse rotiert werden.
c) der Voxel ist freistehend. Die Normale ist völlig frei.
Von diesen drei Szenarien ist eigentlich nur a) wirklich lösenswürdig. Egal, wie dick man die Wände eines Hauses macht, schon in wenigen hundert Metern Distanz sind die Wände durch's LOD nur noch einen Voxel dick. b) kommt auch gelegentlich vor, ist aber selten genug, um auf Nice-To-Have herabgestuft zu werden. c) Ist nahezu ausgeschlossen nach meinem bisherigen Kenntnisstand.
Mein Gedanke war jetzt, dass ich zusätzlich zur Normale noch irgendwie kodiere, welche Freiheitsgrade diese Normale hat, und dann bei der Beleuchtung die Normale relativ zum Betrachter innerhalb dieser Freiheitsgrade anzupassen. Bei Fall a) der doppelseitigen Beleuchtung wäre das die schlichte Auswahl der Richtung, die zum Betrachter hinzeigt. Bei Fall b) wird's schon spannender - entweder ich beleuchte dann den Voxel beim Rendern pro Fragment, oder ich bestimme mir eine Normale, die innerhalb der zulässigen Ebene zum Betrachter hin rotiert ist.
Meine Fragen sind also:
1) welche mathematischen Tricks und Ideen gibt es, die Normalen und Freiheitsgrade zu berechnen?
und 2) wie kodiere ich die dann? Ich werde wahrscheinlich nicht mehr mit nur 3 Komponenten pro Voxel auskommen, aber das ist eh unvermeidlich.