質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

757閲覧

カラーフィルタの計算式について

aoshanghai

総合スコア24

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2017/10/25 09:07

DirectXのシェーダーで、カラーフィルタを試しておりました。
Brightnessを上げていったところ、以下の計算において
おそらく、何か問題があるせいか、白飛びするべき箇所が
白ではなくて、紫っぽい色が出てきたりと、色がおかしくなって
しまいます。

float3 hsv = RGB_to_HSV(saturate(fragColor.rgb)); hsv.y *= 1.0f + Saturation; hsv.z = pow(hsv.z, 1.0f / Gamma); hsv.z = hsv.z * (1.0f + Brightness); hsv.z = 0.5f + (hsv.z - 0.5f) * (1.0f + Contrast); fragColor.rgb = HSV_to_RGB(hsv);

カラーフィルタの正しい計算式を探しだして、上記のコードと照合しようとしておりますが、今のところ見つかっておりません。
(上記のコードは、前任者から引き継いだものです。)
(HSVとRGB同士の変換は見つかりまして、おそらく、ここには問題がなさそうです)

もし、カラーフィルタの計算式について、お勧めのサイトや本などをご存じの方がいらっしゃいましたら、ご教示頂けると助かります。

どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手元にDirectXのプログラミング環境がないのですが、RGV<->HSV変換の実装が例えば以下の資料のようなものだとすると・・・

http://www.pixelmaven.com/jason/articles/ShaderX2/ShaderX2_AdvancedImageProcessing.pdf

入力が0.0f~1.0fの範囲内になってないと結果は範囲外の値になります。
ご質問のコードをみると、RGB_to_HSVへの変換ではsaturateにより範囲内の値へ強制的に丸めてますが、最後のHSV_to_RGBの入力はそうしていないため、フィルターへ与えるパラメーターSaturation, Gamma, Brightness, Contrastの値と元のRGB値によっては彩度と明度が範囲外の値になるため結果のRGB値も範囲外となると思います。

最終段でディスプレーのピクセル値を計算する際にはR,G,B値はそれぞれ0~255の整数値でしょうからフィルターによって範囲外のfloat3値に基づきR,G,Bを計算するとオーバーフローのためぐるっと回っておかしな値になり「白飛びするべき箇所が白ではなくて、紫っぽい色が出てきたり」といった現象になるのではないでしょうか?

最後の行を以下のようにするとどうなるでしょうか?
fragColor.rgb = HSV_to_RGB(saturate(hsv));

投稿2017/10/25 15:31

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoshanghai

2017/10/26 07:31

ご回答ありがとうございます。 大変助かります。 1点修正ですが、HSVと書いていたのですが、 実は、HSLを使用してありました。 そして、頂いたご意見をもとに試行錯誤していたのですが、 HSLのLについて、RGB変換直前に、0.0f~1.0fにclamp したところ、色がおかしくなる現象はでなくなりました。 資料には、0%~100%と書いてありますが、プログラム中では、 0.0f~1.0fになるのだと思います。 ひとまず、これで、様子を見ていきます。 ご教示ありがとうございました。
KSwordOfHaste

2017/10/26 07:39

プログラム上は100%を1.0fとして扱うことが多いので、資料もそういう意味で書いてあったのだと思います。 ヒントになったようで幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問