Ändern Sie das Bild so, dass es durch eine bunte Brille aussieht

7

Ich arbeite derzeit an einem einfachen Pixel-Shader in HLSL. Ich sende eine Shader-Textur und möchte sie bunter machen (so etwas wie im Bild unten).

Geben Sie hier die Bildbeschreibung ein

In Bild 1 gibt es Originaltextur. Bild 2 zeigt einen Effekt, den ich erzielen möchte. Gibt es dafür eine mathematische Formel? Meine Eingabe ist der RGBA-Wert jedes Pixels.

EDIT: Ich werde versuchen, konkreter zu schreiben.

Angenommen, ich möchte diese Gartentextur roter machen. Ich nehme an, was ich tun muss, ist:

OutputR = InputR * X,

OuputG = InputG * Y,

OutputB = InpputB * Z

Aber wie finde ich X, Y und Z?

bartosz.baczek
quelle
Wenn Sie "bunter" sagen, meinen Sie damit speziell, als würden Sie durch getöntes Glas schauen?
Trichoplax
Ja, das meine ich
bartosz.baczek
Möchten Sie die Farbtonfarbe auch als separate Eingabe verwenden, oder möchten Sie nur eine beliebige Farbtonfarbe, deren Implementierung billig ist?
Trichoplax
Entschuldigung, ich glaube ich verstehe deine Frage nicht. Könnten Sie das mehr erklären?
Bartosz.baczek
Wenn Kostas Anagnostou antwortet, was Sie wollen, dann ignorieren Sie meine Kommentare. Ich habe nur gefragt, ob Sie das oder eine fest codierte Farbe wollen.
Trichoplax

Antworten:

6

Die Antwort von Kostas Anagnostou ist eine häufig verwendete Formel für die Entsättigung

float value = 0.3 * InputR + 0.59 * InputG + 0.11 * InputB;

Dies trägt der Tatsache Rechnung, dass unterschiedliche Farbtöne von einem menschlichen Beobachter mit unterschiedlicher Intensität wahrgenommen werden.

Wenn Sie dem Beispiel weiter folgen, definieren Sie eine Farbfarbe, die mit dem entsättigten Wert multipliziert wird. Sie können das getönte Bild auch mit Ihrem Original mischen, um einen weniger drastischen Effekt zu erzielen. In diesem Fall mischen wir 80% des mit (1,0, 0,2, 0,2) getönten entsättigten Bildes mit 20% des Originals:

float3 tint = float3(1.0, 0.2, 0.2);
float tintMix = 0.8;
OutputR = tintMix * value * tint.r + (1.0 - tintMix) * InputR;
OutputG = tintMix * value * tint.g + (1.0 - tintMix) * InputG;
OutputB = tintMix * value * tint.b + (1.0 - tintMix) * InputB;
David Kuri
quelle
1
Beachten Sie, dass (0,3, 0,59, 0,11) die Luma-Koeffizienten für Rec sind. 601 (auch bekannt als Standard Def. NTSC), während Rec. 709 (auch bekannt als High Def. ATSC) wäre (0,2126, 0,7152, 0,0722). Und sRGB-Bilder (mit denen Sie wahrscheinlich zu tun haben) sind näher an Rec. 709 als Rec. 601.
user1118321
13

(XYZ) kann die RGB-Farbe sein, mit der Sie Ihre Szene tönen möchten. Für die obige Szene kann es eine rote Farbe (1,0, 0,0, 0,0) oder etwas Ähnliches mit einer starken roten Komponente sein.

Denken Sie daran, dass die Farbe, da Sie sie multiplikativ anwenden, als Filter fungiert, der die ursprünglichen Farbkomponenten unterdrückt. Wenn Ihre Szene also größtenteils grün ist, Sie jedoch einen Rotfilter (1,0,0) anwenden (dh damit multiplizieren), ist die resultierende Szene sehr dunkel.

Ein Trick, den Sie in solchen Fällen möglicherweise ausführen könnten, besteht darin, die ursprüngliche Szene zu entsättigen und sie dann mit der Farbtonfarbe zu multiplizieren. Auf diese Weise behalten Sie die Gesamtbildintensität bei und erzielen den gewünschten Farbton.

Hier ist zum Beispiel das Bild multipliziert mit (1, 0, 0), (1, 0,2, 0,2) und (1, 0,5, 0,5) von links nach rechts:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Kostas Anagnostou
quelle
Vielleicht möchten Sie auch etwas anderes als 100% reine Einkanalfarbe tönen.
Jojaja
3
Ich habe dem Beitrag einige Beispielbilder hinzugefügt - hoffe, es macht Ihnen nichts aus!
Nathan Reed
Genau das habe ich gemeint. Vielen Dank für Mühe und Beispiele :)
bartosz.baczek
3

Wählen Sie die Farbe RGB Ihre bunten Gläser und wählt , wie transparent sie durch die Wahl eines Alpha - Wert A. Dann sind Alpha - Verbund die Brille auf der Oberseite des Eingangsbildes:

OutputR = R * A + InputR * (1-A)
OutputG = G * A + InputG * (1-A)
OutputB = B * A + InputB * (1-A)
lhf
quelle
Was meinst du mit "zusammengesetzt"? Gibt es eine mathematische Operation, mit der ich zwei Farben zusammensetzen kann?
Bartosz.baczek
Das ist es, was die Beispielgleichungen in seinem Beitrag tun.
Yuriks
2
Ich glaube nicht, dass er das will. Wenn Sie eine rot getönte Brille tragen, sehen Sie rote Wellenlängen bei grundsätzlich voller Stärke und sehr wenig von anderen Wellenlängen. Das passt nicht gut zum Alpha-Compositing.
John Calsbeek