Graphics Reference
In-Depth Information
derjenigen Facetten relevant, die die Facette j sehen kann. Zu ihrer Berechnung ist
nur ein einziger
Hemi-Cube
- oder eine
Single-Plane
- um die Facette j zu legen,
mit dem man dann alle k Formfaktoren berechnet. Diese nur zur Facette j gehören-
den Formfaktoren speichert man auf Vorrat, falls Facette j im weiteren Verlauf der
Iteration abermals etwas zu verteilen hat. Normalerweise ist dieser Programmteil in
der Iterationsschleife integriert (nicht im folgenden Code) [
12
].
Der Vektor
{B}
bekommt im Laufe der Iteration die umverteilte Radiosity. Die
Umverteilung selbst erfolgt über den Vektor
B
!f
del
B
g
, dessen Komponenten
nach und nach kleiner werden, bis die Umverteilung hinreichend genau erfolgt ist.
Beide Vektoren werden vorbesetzt mit jeweils der halben Emission
{E
m
}
, sodass
am Ende der Umverteilung diese auch nur einmal enthalten ist.
Jeder Iterationsschritt verteilt die Strahlung derjenigen Facette mit der größten
Reststrahlung
f
del
B
gf
A
g
, das ist die Position „lfnr“ im Vektor. Der zugehörige
Umverteilungs„wert“ ist zugleich Schalter für den Abbruch der Iterationsschleife.
{A}
ist die Facettenfläche. Die relativ schnelle Konvergenz des Algorithmus basiert
auf dieser Vorgehensweise, denn „unergiebige“ Strahlungen werden gar nicht erst
angefasst.
' Progressive-Refinement
' ----------------------
Dim Nung As Integer ' Ordnung Matrizen & Vektoren
Dim lfnr As Integer ' Ort der größten Strahlung
Dim Wert, delR As Single ' Strahlungswert und Verteiler
ReDim FF(Nung,Nung) As Single ' Formfaktoren [F]
ReDim B(Nung), delB(Nung), A(Nung) As Single
ReDim Em(Nung), rho(Nung) As Single
'
' initialisieren mit Emission {Em}
Fork=1ToNung
Wert = 0.5
*
Em(k)
B(k) = Wert
delB(k) = Wert
Next
'
' Schleife bis Konvergenz
Do
Fork=1ToNung
'
' größten Wert suchen
Wert = 0.0
Forj=1ToNung
If delB(j)
*
A(j) > Wert Then
lfnr = j
Wert = delB(lfnr)
*
A(j)
End If
Next j
Wert = delB(lfnr)
'
' verteilen auf alle Facetten