OpenGLは、1つの側から他の側への色の勾配で矩形に色を付けることができます。私はOpenGLのRGBではなくHSVのグラデーション
glBegin(GL_QUADS);
{
glColor3d(simulationSettings->hotColour.redF(), simulationSettings->hotColour.greenF(), simulationSettings->hotColour.blueF());
glVertex2d(keyPosX - keyWidth/2, keyPosY + keyHight/2);
glColor3d(simulationSettings->coldColour.redF(), simulationSettings->coldColour.greenF(), simulationSettings->coldColour.blueF());
glVertex2d(keyPosX - keyWidth/2, keyPosY - keyHight/2);
glColor3d(simulationSettings->coldColour.redF(), simulationSettings->coldColour.greenF(), simulationSettings->coldColour.blueF());
glVertex2d(keyPosX + keyWidth/2, keyPosY - keyHight/2);
glColor3d(simulationSettings->hotColour.redF(), simulationSettings->hotColour.greenF(), simulationSettings->hotColour.blueF());
glVertex2d(keyPosX + keyWidth/2, keyPosY + keyHight/2);
}
私はHSVとRGBの間の変換を行うために、いくつかのQtライブラリを使用しているC++でそのために以下のコードを使用しています。コードからわかるように、私はhotColourとcoldColourという名前のカラーグラデーションを使って四角形を描画しています。
なぜ私はこれをやっていますか?私が作ったプログラムでは、空間内の3Dベクトルを描画し、その長さを色で示します。ユーザーはホット(高値)と低温(低値)の色を選択できるようになり、HSVスケーリングを使用してグラデーションが自動的に実行されます。
なぜHSVスケーリングですか? HSVは私が使用しているカラーマップに沿って単一値であるため、直線的にグラデーションを作成するのは非常に簡単な作業です。色を選択するユーザーのために、私はこのカラーマップでは彼にQColourDialogカラーマップ
http://qt-project.org/doc/qt-4.8/qcolordialog.html
を提供し、あなたはそれが不可能な線形を持つようになって、赤が右と左に利用可能であることがわかりますRGBを使用したこのカラーマップのスケール。しかし、HSVでは、リニアスケールは非常に簡単に達成可能です。ここでは、Hue値に0〜360のリニアスケールを使用するだけです。
このパラダイムでは、暑い色と寒い色が勾配の方向を定義していることがわかります。たとえば、色相を冷気で0、高温で359と選択すると、HSVは0と359であり、勾配内の色の全スペクトルを含む。一方、OpenGLでは、基本的には赤から赤に変わりますが、これはグラデーションではありません!!!!!!
OpenGLに強制的にRGBではなくHSVグラジエントを使用させることができますか?私に起こる唯一のアイデアは、私が色付けしたい矩形をスライスし、小さな矩形に多くの勾配をつけることですが、これを行うには最も効率的な方法ではないと思います。
アイデア?
「6」は、最初の計算では「float h = hsv.x * 6.;」となりますが、それはどういう意味ですか? – tobsen
また、vec2 cx = vec2(v * s、c *(1 - abs(mod(h、2))));); ')の行に定義されている" c " – tobsen
@tobsen: 'c'編集で代用するのを忘れました。ファクタ6について:HSLの色相は角度として与えられ、上のコードは、0°〜360°または0°のHに対応する0 ... 1の値域hのカラーサイクルの完全な回転を仮定しています〜2pi。したがって、カラーサイクルで6つのセクタがあり、h値の範囲を6倍に拡大し、2を法とする(cx計算で)と、一連のif文がH円の原色間の補間を行います怒り – datenwolf