168, 0, 255
などのRGB値が与えられた場合、色の濃淡(明るくする)と陰影(暗くする)を作成するにはどうすればよいですか?
いくつかのオプション シェーディングとティント用:
シェードの場合、各コンポーネントに前の値の1/4、1/2、3/4などを掛けます。係数が小さいほど、陰が濃くなります。
濃淡の場合、(255-前の値)を計算し、それに1/4、1/2、3/4などを掛けて(係数が大きいほど濃淡が薄くなります)、それを前の値に加算します(それぞれを想定) .componentは8ビット整数です)。
色の操作(色合いやその他のシェーディングなど)は、linear RGBで行う必要があることに注意してください。ただし、ドキュメントで指定された、または画像とビデオでエンコードされたRGBカラーは、線形RGBになる可能性が低く、その場合、いわゆる逆伝達関数 RGBカラーの各コンポーネントに適用する必要があります。この関数は、RGBカラースペースによって異なります。たとえば、sRGB色空間(RGB色空間が不明な場合に想定される)では、この関数はroughly各sRGB色を上げることと同等です。コンポーネント(0〜1の範囲)の2.2乗。 (「リニアRGB」はRGBカラースペースではないことに注意してください。)
「ガンマ補正」に関するViolet Giraffeのコメントも参照してください。
カラーモデルに応じて、より暗い(影付き)色またはより明るい(色付き)色を作成する方法が異なります。
RGB
:
シェーディングするには:
newR = currentR * (1 - shade_factor)
newG = currentG * (1 - shade_factor)
newB = currentB * (1 - shade_factor)
色合いを付けるには:
newR = currentR + (255 - currentR) * tint_factor
newG = currentG + (255 - currentG) * tint_factor
newB = currentB + (255 - currentB) * tint_factor
より一般的には、色RGB(currentR,currentG,currentB)
と色RGBA(aR,aG,aB,alpha)
を重ねた色は次のとおりです。
newR = currentR + (aR - currentR) * alpha
newG = currentG + (aG - currentG) * alpha
newB = currentB + (aB - currentB) * alpha
(aR,aG,aB) = black = (0,0,0)
はシェーディング用、(aR,aG,aB) = white = (255,255,255)
は色付け用
HSV
またはHSB
:
Value
/Brightness
を下げるか、Saturation
を増やしますSaturation
を下げるか、Value
/Brightness
を増やしますHSL
:Lightness
を下げますLightness
を増やしますあるカラーモデルから別のカラーモデルに変換する数式があります。最初の質問にあるように、RGB
にいて、たとえばHSV
モデルを使用してシェーディングしたい場合は、単にHSV
に変換し、シェーディングを行ってからRGB
に戻すことができます。変換する式は簡単ではありませんが、インターネットで見つけることができます。言語によっては、コア機能としても利用できる場合があります。
RGB
には実装が非常に簡単であるという利点がありますが、HSV
またはHSB
は、2つのパラメーターを使用して必要なものを取得する必要があるため(Saturation
&Value
/Brightness
)複雑ですHSL
は、私の観点から最高です:50%
は、変更されていない色相を意味します>50%
は、色相が明るいことを意味します(色合い)<50%
は、色相がより暗い(陰影)ことを意味しますLightness
部分を置き換えるだけで)色を相対的にまたは絶対に色付けまたはシェーディングできます。私は現在、キャンバスとピクセルを実験しています...このロジックがうまく機能していることがわかりました。
'tint'値をオフセットに追加します
var grey = (r + g + b) / 3;
var grey2 = (new_r + new_g + new_b) / 3;
var dr = grey - grey2 * 1;
var dg = grey - grey2 * 1
var db = grey - grey2 * 1;
tint_r = new_r + dr;
tint_g = new_g + dg;
tint_b = new_b _ db;
またはそのようなもの...