プレイ日記
moh6an moh6an
【お知恵拝借】glatteHaut進捗報告番04A
12そうだね
プレイ済み
返信[1]
親投稿
moh6an moh6an
SBKEY:【SEVXDNAV】 透明なレイヤに対する半透明の重ね塗りで困ってます 今まで、多階調レイヤの存在しないglätteに於いては 白地の最大α値で合成で問題なかったのですが 現時点で同じアプローチでα値を重ね塗りすると 不透明度が高くなっていかず、現在α値に収束してしまいます。(不透明度100%に薄く塗ろうとすると、薄い不透明度に収束してしまう) α値の重ね塗りをRGBの色値と同じアプローチで合成した結果のようです。普通にα値を加算してゆくには どういうアプローチがいいのでしょう? 現α値の重ね塗りの計算方法は 出力α値=((元α値*塗α値)+(描α値*塗α値)*最大α値 です。(RGBの塗りと同じ計算) これは変なのはわかるのですが・・・
0そうだね
プレイ済み
返信[2]
親投稿
すう SU-KUN
mohさんらしいSBKEYですね(゚Д゚;)…と余談はさておき(笑) 実は、Picsも開発段階で8bitアルファチャンネルの実験をしていました。ただ、想定する描画色をどんな色にして、透明度はどうすればいいのかよくわからなくなり、これは手ごわいと思いそのまま放置です^^;実際、アルファ値なしの合成と比べても、大幅に混色の結果が異なってしまい、収集がつかなかったのもあって。 市販ソフトPainterでも、実質のレイヤーがなかった古いバージョンとでは、混色に大きな差があります。α付レイヤー搭載後、表現力が大幅に乏しくなった覚えがあるので、何かを犠牲にしたのかと思います。(本来、アナログ画材に画材別の透明度があるわけではないですし、どうしても透明フィルムを重ねたような表現になるのかなと) つづく
0そうだね
プレイ済み
返信[3]
親投稿
すう SU-KUN
すうの考えでは、透明度は適当に加算(乗算ではなく。あと、最大値は描画α値に抑えておくとか)してしまって、その最終結果が正しくなるような描画色に調整すればいけるのではと考えてますが、実際どうなのかよくわかりません… 市販のお絵かきソフトで、描画後、透明度と実質の色がどのように変化するのかをグラフ化するなどすれば、計算方法がみつかるかもしれません。(余談ですが、すうは古いPainterの水彩の混色方法を探ったのですが、明るい色と暗い色で計算結果が異なり、単なるRGB操作では不可能な感じで、最後までつきとめられず…) 後、描αと、塗αの違いはなんでしょうか?
0そうだね
プレイ済み
返信[4]
親投稿
moh6an moh6an
塗αと描αはおなじですねRGB値がαに置換しただけ 図にするとこんなんでしょうか?
0そうだね
プレイ済み
返信[5]
親投稿
すう SU-KUN
すみません、mohさんの図が全くわからない^^; 気になったので、Clip Studio Paintで試してみました。 1.完全に透明なキャンバスに、透明度50%のペンで描きます 2.さらに50%を重ねます 3.25%をそれぞれに重ねます これで、(1)50%1回、(2)50%2回、(3)25%1回、(4)50%1回に25%1回、(5)50%2回に25%1回の5通りのパターンが描画されます。 「描画後の透明度」 (1)50% (2)25% (3)75% (4)38% (5)19% と言う結果が出ました。 描画αをA、キャンバス地のαをC、最大値(不透明)を1.0とした時、 ” α=(1-A)*C ” という計算になるようです。(確定ではないけど)
1そうだね
プレイ済み
返信[6]
親投稿
すう SU-KUN
ん、α = A*(1-C) かな?^^;あれれ(混乱中)
0そうだね
プレイ済み
返信[7]
親投稿
Clifford CliffordEx
すでに結論が出ているようですが アルファ値を0.0から1.0で表すとして色Aのアルファ値をAa、色Bのアルファ値をBaと表します。 ※数値の割当はある範囲の整数でも構いませんが、実数のほうがデバイス依存にならないので。 アルファ値とはと考えると「背景の色が透けない割合」と言いかえることができます。 たぶんこの考え方がとても重要。 つまりアルファ値1.0は「背景の色が全く透けない」状態であり、0.0は完全に透けた状態。 アルファ値0.9の色は背景色の90%の透過を阻害します。 逆に言えば10%(=1.0-0.9=0.1)は透過するわけです。 半透明な色を重ねるならこれが繰り返されます。 したがって、半透明な2色ABが重なった場合光の透過度合いは (1.0-Aa)*(1.0-Ba) で表すことができます。
1そうだね
プレイ済み
返信[8]
親投稿
Clifford CliffordEx
「光の透過度合い」って書いちゃった。 「背景色」の「透過の阻害度合い」つまりアルファ値ですね。
0そうだね
プレイ済み
返信[9]
親投稿
moh6an moh6an
む、むむぅ・・アルファ値合成の考え方は知識として知っているものの、身体にイメージとして湧いてこないんです・・・、んで、ソースコードに落としてみたのですが 2159行+3が現行処理 2165行+3がcliffordさん案 2170行+2がすうさん案なのですが、 現状どちらもうまく描けない・・・
0そうだね
プレイ済み
返信[10]
親投稿
moh6an moh6an
VRAM配列がglätteHautの編集領域で Paが描画α値0-255 Vaが編集ピクセルのα値0-255 です MAXalpがα値定数255です
0そうだね
プレイ済み
返信[11]
親投稿
すう SU-KUN
さきほどのコメントで、α値と書きましたが、実際は0.0が透明、1.0が不透明としてるので、「不透明度」となりますね^^; mohさんの、検証してないですが、最大値が255の場合は、1.0-の所が255-になるほか、1.0*1.0=1の答えが、255*255=65,025になるので、掛け算のあとに最大値(255)で割らないといけないと思います。 あと、最後にMAXalpをかけてるのは結果がおかしくなるような気がします…
0そうだね
プレイ済み
返信[12]
親投稿
すう SU-KUN
掛けるのではなく、alp=MIN(alp,MAXalp)で想定する最大値を保てそうかな?(未検証)
0そうだね
プレイ済み
返信[13]
親投稿
moh6an moh6an
や、ALP1#及びALP2#は2165行と2166行でα最大値で割っているので 値が0-1.0の範囲になっているはず・・・なんですが・・・ 現行計算でもあとで色をスポイトで取り直すときちんと混色される・・・ もしかしたら、混色の問題ではなく不透明度設定バーの問題・・なの・・か?
0そうだね
プレイ済み
返信[14]
親投稿
すう SU-KUN
最大値ってそういう意味だったんですね^^;描画する透明度なのかと思ってました。 計算式があってても結果が違うとなれば、計算する要素の代入で誤ってるか、どこか別の所で値を変化させてしまっているか、表示関連で誤りがあるのか。もしくは、RGB値の計算ミスとかでしょうか。
1そうだね
プレイ済み
返信[15]
親投稿
moh6an moh6an
もう一度全体を見直してみます。夜分までお付き合いくださって申し訳ない
1そうだね
プレイ済み
返信[16]
親投稿
moh6an moh6an
Todo ・ちょっとだけボタンを押したら、継続的に画面変化し 長めにボタンを押したら、押している間だけ画面変化するしくみを実装 ・RGB/HSV選択式 ・旧glätteのフラットペン実装
0そうだね
プレイ済み
返信[17]
親投稿
他の方の式がいまいち理解できていないので 重複していたら先にお詫びします。 元の透明度が完全な不透明になる割合ではないでしょうか? 元50%の50%を重ねると 元50%が不透明100%になる割合の50%で75% 元90%に90%を重ねると 元90%が不透明100%になる割合90%で99% イメージ的に透けているもの同士を重ねても 完全な不透明にならないことを考えるとですが… プチコンなのにイメージの説明で申し訳ないです(^^;
0そうだね
プレイ済み
返信[18]
親投稿
あっRGBのブレンドとアルファの関係みたいですね 申し訳ない…… <(_ _)>
0そうだね
プレイ済み
返信[19]
親投稿
それなら重ねる色のアルファから影響の受ける量を計算して 元のアルファの割合で影響を受ける割合で算出する アルファ80%の白を重ねる場合 変化量は100%-80%で20% 黒でアルファが100%なら影響力は最大20% 黒でアルファが50%なら影響力は半分10% 白黒同様これを各RGBで処理するっていうのはどうでしょうか?
0そうだね
プレイ済み
返信[20]
親投稿
すえ sue_qwerty
もう解決されたかもしれませんが、 こんな感じでどうでしょうか?
0そうだね
プレイ済み
返信[21]
親投稿
moh6an moh6an
わさびんさん、すえさん、ありがとうございます。 原因ははっきりしないのですがソースを見直したら、いつの間にか改善してた・・・(いちばん後で苦労するパターン) 次の版トピ行きます。
1そうだね
プレイ済み
返信[22]
親投稿
すう SU-KUN
とりあえず解決したようでお疲れ様です。すでにどこかで変数の競合とか起きてなければいいけど^^;
0そうだね
プレイ済み
返信[23]
親投稿
moh6an moh6an
関数定義の変数名を見直して、紛らわしい引数を削除したりしました。 見通しが悪かったので、色関係は返却値で値をやり取りするのはやめて、グローバル変数にまとめました、困ったときには後で考えることにします ( •̀ㅁ•́;)
1そうだね
プレイ済み
返信[24]
親投稿
moh6an moh6an
では次のトピに
1そうだね
プレイ済み