OpenGL-Farbinterpolation

8

Ich arbeite gerade an einem kleinen Projekt in C ++ und OpenGL und versuche, ein Farbauswahl-Tool ähnlich wie in Photoshop zu implementieren, wie unten.

Ich habe jedoch Probleme mit der Interpolation des großen Quadrats. Wenn ich mit einem 8800 GTS an meinem Desktop-Computer arbeitete, war das Ergebnis ähnlich, aber die Mischung war nicht so glatt.

Dies ist der Code, den ich verwende:

%Vor%

Bei meinem Laptop mit Intel Graphics HD 3000 war dieses Ergebnis noch schlimmer, ohne dass der Code geändert wurde.

Ich dachte, es wäre OpenGL, das Quad in zwei Dreiecke aufzuteilen, also habe ich versucht, mit Dreiecken zu interpolieren und die Farbe in der Mitte des Quadrates selbst zu interpolieren, aber es stimmt immer noch nicht mit dem Ergebnis überein, auf das ich gehofft hatte.

    
Will-of-fortune 03.11.2012, 16:14
quelle

3 Antworten

11

Ich habe schnell einen Vertex- / Fragment-Shader erstellt, der die Farben erfolgreich interpoliert:

%Vor%

Hier ist das Ergebnis:

Das Anwenden auf ein Quad ergibt nun das korrekte Ergebnis, da die Interpolation wirklich über die gesamte Oberfläche erfolgt, indem x und y Koordinaten verwendet werden. Siehe @datenwolfs detaillierte Erklärung, warum das funktioniert.

BEARBEITEN 1 Um die volle Farbpalette in einem funktionellen Farbwähler zu erhalten, ist es möglich, den Farbton interaktiv zu ändern (siehe Ссылка ).

Live-Online-Demo: Ссылка

%Vor%

BEARBEITEN 2 : Wenn nötig, sollten Shader zur Verwendung mit Texturkoordinaten (um auf Quads mit Texturkoordinaten von 0 bis 1 angewendet zu werden) in etwa so aussehen. Nicht getestet.

Fragment Shader:

%Vor%

Ein Passthrough-Vertex-Shader:

%Vor%     
num3ric 03.11.2012 16:58
quelle
9
___ qstnhdr ___ OpenGL-Farbinterpolation ___ answer29717745 ___

Ich mochte die Antwort der obersten Wahl nicht, da sie so wörtlich ist und sich in der einfachen Antwort nur auf Rot konzentriert, also wollte ich mit einer einfachen Alternative auf der Basis der Eckpunktfarbe reinkommen:

%Vor%

Das ist einfach zu erklären und zu begründen. mix ist eine lineare Interpolation, oder lerp in glsl. Also mische ich zwischen der Scheitelpunktfarbe und Weiß entlang der inversen X-Achse, dies gibt mir Weiß oben links und reine Farbe oben rechts. Mit dem Ergebnis davon mische ich zu Schwarz entlang der y-Achse und gebe mir Schwarz auf der Unterseite.

Ich hoffe, das hilft, ich bin auf diese Antwort gestoßen und fand heraus, dass es nicht sehr hilfreich war, etwas anderes als hart gebackene rote, grüne oder blaue Paletten zu bekommen, und das adjustHue-Bit war einfach nicht das, was ich wollte / p>

Damit dies funktioniert, müssen Sie alle Vertexfarben auf die gewünschte Farbe einstellen und sicherstellen, dass Ihre UV-Koordinaten eingestellt sind:

%Vor%     
___ tag123opengl ___ OpenGL (Open Graphics Library) ist ein Grafikstandard und eine API, die plattformunabhängig und für Desktops, Workstations und mobile Geräte verfügbar ist. Es wurde entwickelt, um hardwarebeschleunigtes Rendering bereitzustellen und bietet daher eine erheblich verbesserte Leistung gegenüber dem herkömmlichen Software-Rendering. OpenGL wird für Anwendungen wie CAD-Software und Computerspiele verwendet. Der OpenGL-Standard sowie OpenGL ES wird von der Khronos-Gruppe gesteuert. ___ qstntxt ___

Ich arbeite gerade an einem kleinen Projekt in C ++ und OpenGL und versuche, ein Farbauswahl-Tool ähnlich wie in Photoshop zu implementieren, wie unten.

Ich habe jedoch Probleme mit der Interpolation des großen Quadrats. Wenn ich mit einem 8800 GTS an meinem Desktop-Computer arbeitete, war das Ergebnis ähnlich, aber die Mischung war nicht so glatt.

Dies ist der Code, den ich verwende:

%Vor%

Bei meinem Laptop mit Intel Graphics HD 3000 war dieses Ergebnis noch schlimmer, ohne dass der Code geändert wurde.

Ich dachte, es wäre OpenGL, das Quad in zwei Dreiecke aufzuteilen, also habe ich versucht, mit Dreiecken zu interpolieren und die Farbe in der Mitte des Quadrates selbst zu interpolieren, aber es stimmt immer noch nicht mit dem Ergebnis überein, auf das ich gehofft hatte.

    
___ tag123interpolation ___ Alles, was sich auf Funktionsinterpolation bezieht, d. h. die mathematischen Techniken zum Schätzen des (unbekannten) Werts einer Funktion in einem Punkt auf der Basis einer Menge bekannter Werte in anderen (üblicherweise nahe gelegenen) Punkten. Informationen zur Interpolation von Strings finden Sie unter [tag: string-interpolation]. ___ answer13211349 ___

Ich habe schnell einen Vertex- / Fragment-Shader erstellt, der die Farben erfolgreich interpoliert:

%Vor%

Hier ist das Ergebnis:

Das Anwenden auf ein Quad ergibt nun das korrekte Ergebnis, da die Interpolation wirklich über die gesamte Oberfläche erfolgt, indem %code% und %code% Koordinaten verwendet werden. Siehe @datenwolfs detaillierte Erklärung, warum das funktioniert.

BEARBEITEN 1 Um die volle Farbpalette in einem funktionellen Farbwähler zu erhalten, ist es möglich, den Farbton interaktiv zu ändern (siehe Ссылка ).

Live-Online-Demo: Ссылка

%Vor%

BEARBEITEN 2 : Wenn nötig, sollten Shader zur Verwendung mit Texturkoordinaten (um auf Quads mit Texturkoordinaten von 0 bis 1 angewendet zu werden) in etwa so aussehen. Nicht getestet.

Fragment Shader:

%Vor%

Ein Passthrough-Vertex-Shader:

%Vor%     
___
datenwolf 03.11.2012 16:59
quelle
3

Ich mochte die Antwort der obersten Wahl nicht, da sie so wörtlich ist und sich in der einfachen Antwort nur auf Rot konzentriert, also wollte ich mit einer einfachen Alternative auf der Basis der Eckpunktfarbe reinkommen:

%Vor%

Das ist einfach zu erklären und zu begründen. mix ist eine lineare Interpolation, oder lerp in glsl. Also mische ich zwischen der Scheitelpunktfarbe und Weiß entlang der inversen X-Achse, dies gibt mir Weiß oben links und reine Farbe oben rechts. Mit dem Ergebnis davon mische ich zu Schwarz entlang der y-Achse und gebe mir Schwarz auf der Unterseite.

Ich hoffe, das hilft, ich bin auf diese Antwort gestoßen und fand heraus, dass es nicht sehr hilfreich war, etwas anderes als hart gebackene rote, grüne oder blaue Paletten zu bekommen, und das adjustHue-Bit war einfach nicht das, was ich wollte / p>

Damit dies funktioniert, müssen Sie alle Vertexfarben auf die gewünschte Farbe einstellen und sicherstellen, dass Ihre UV-Koordinaten eingestellt sind:

%Vor%     
M2tM 18.04.2015 13:02
quelle

Tags und Links