Ihre Beleuchtungsgleichung ist physikalisch korrekt. Im wirklichen Leben sieht man jedoch fast nie hochreine Farben. (Eine Ausnahme ist, wenn Laser beteiligt sind.) Das ist wahrscheinlich der Grund, warum Sie sich vorstellen, dass Rot * Blau = Violett - ein realistischeres Rot könnte etwa (1, 0,1, 0,1) und ein Blau (0,1, 0,1, 1) sein. Multiplizieren Sie diese und Sie erhalten (0,1, 0,01, 0,1), was in der Tat ein (dunkles) Violett ist.
Ebenso ist nichts perfekt schwarz. Sogar schwarzer Kunststoff, Farbe oder Stoff haben zumindest eine kleine Spiegelreflexion. Die Spiegelalbedo bei normaler Inzidenz liegt bei den meisten Materialien nicht unter etwa 2% und steigt bei streifendem Auftreten aufgrund des Fresnel-Effekts an. ( Superschwarz ist eine Ausnahme - ein spezielles Material, das bei normaler Inzidenz nur 0,4% widerspiegelt.)
Bei einem weißen Material hat das reflektierte Licht die Lichtfarbe und ist nicht vollständig weiß. Sie müssen hier jedoch aufpassen, wie Ihr Gehirn Ihnen einen Streich spielt: Es passt sich der Gesamtfarbe des Lichts um Sie herum an, sodass weiße Objekte selbst bei Beleuchtung mit farbigem Licht wahrnehmungsmäßig weiß aussehen. Aus diesem Grund haben Digitalkameras einen Weißabgleich - Fotos würden ohne diese Einstellung völlig falsch aussehen. (Dies funktioniert natürlich nur bis zu einem gewissen Punkt - beleuchten Sie einen Raum mit einem roten Laser und die Dinge sehen rot und nicht weiß aus.) Spiele simulieren diesen visuellen Anpassungsprozess jedoch im Allgemeinen nicht. Stattdessen haben sie nur helle Farben, die weniger gesättigt sind als in der Realität.
(Übrigens ein Nitpick: Ihre Beleuchtungsgleichung sollte saturate()
um das Punktprodukt herum liegen, um zu vermeiden, dass auf der dunklen Seite eines Objekts negative Werte erzeugt werden.)