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.
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%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%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.
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%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%Tags und Links opengl interpolation