スクリーン合成での色の反転

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています

投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/7/24 0:15
たにし  新米   投稿数: 4
お世話になります。
blender2.58
MacOS10.5.8 を使っています。

ノード機能(コンポジット)を使用して、スクリーン合成をしたのですが(画像右)、
スクリーンなら、白と白が重なって本来白となるはずの部分が反転して黒くなってしまいました。
(画像左、上の二つを合成した結果が左下)
これはバグ、あるいは仕様でしょうか。

一応、球でスクリーン合成のみを使って同じ事をやってみたのですが、やはり最も明度の高い部分から反転していくようです。


投票数:5 平均点:6.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/7/25 11:16
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
WindowsXp
Blender Ver2.58.1 Rev.38614でやってみましたが普通に出来てるように思いますが・・・
一応、画像を添付。



投票数:6 平均点:8.33
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/8/3 10:43
たにし  新米   投稿数: 4
随分遅れてしまい申し訳ありません。返信ありがとうございます。

題名にも書いていますし、
前に添付した画像を良く見ていただければわかるとおもいますが、
合成方法は中間値を取るMixではなく、加算するScreenです。

球で試した際は、Screen合成を何度か繰り返しました。

投票数:5 平均点:6.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/8/3 12:53
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
あ、失礼・・・・添付画像違ってたようで・・・
こっちだよね?


普通に出来てるように見えますが・・・


投票数:6 平均点:6.67
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/8/3 13:19
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
ついでにPhotoShopでやった結果も添付しておきますね。




投票数:4 平均点:2.50
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/8/3 20:28
たにし  新米   投稿数: 4
何度もありがとうございます。

私なりに実験してみた結果ですが、

添付した画像の場合、中央下のscreenのfac値を1以下にすると反転現象が起きません。
しかし1以上にした場合、画像の様になり、
本来変化しないはずの右上の白の部分が反転を起こしています。
ちなみに、画像では横縞の方に最初のscreenが適用されていますが、
ノードのimageの部分の接続を逆にして、縦縞の方に適用させると
反転は左下に起こります。

左上で球でも実験していますが、鏡面反射している部分は、
(見えづらいですが)一回の処理で反転が起こっています。


投票数:2 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/8/4 9:11
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
ソースコードを見た方が早いと思ったので少し調べて見ました。

SCREENの処理はこうなっています。

void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
{
  float tmp, facm= 1.0f-fac;
  
  switch (type) {
    case MA_RAMP_BLEND:
      *r = facm*(*r) + fac*col[0];
      if(g) {
        *g = facm*(*g) + fac*col[1];
        *b = facm*(*b) + fac*col[2];
      }
        break;
    case MA_RAMP_ADD:
      *r += fac*col[0];
      if(g) {
        *g += fac*col[1];
        *b += fac*col[2];
      }
        break;
    case MA_RAMP_MULT:
      *r *= (facm + fac*col[0]);
      if(g) {
        *g *= (facm + fac*col[1]);
        *b *= (facm + fac*col[2]);
      }
        break;
    case MA_RAMP_SCREEN:
      *r = 1.0f - (facm + fac*(1.0f - col[0])) * (1.0f - *r);
      if(g) {
        *g = 1.0f - (facm + fac*(1.0f - col[1])) * (1.0f - *g);
        *b = 1.0f - (facm + fac*(1.0f - col[2])) * (1.0f - *b);
      }
        break;

これを見る限りではfacは0.0-1.0の範囲を想定しているように見受けられます。
PhotoShopでも0-100%の範囲でしか設定できませんし・・・・

投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011/8/4 15:02
たにし  新米   投稿数: 4
ソースを見る限り、この場合問題はfac値の方ではなく、
最大値以上のRGB値が渡されたために、はみ出た分だけ反転を起こしている
と考えた方が自然ですね。
そう考えると、二番目の実験のときなぜ右上だけ反転したのか、
なぜfac値1以下だと反転しないのかも説明がつきます。
やはり仕様またはバグのようですね。

というわけで実験してみました。fac値1以下で
上段は、照明を強くした球
下段は明度・コントラストを調節した白黒グラデーション

スレッドの最初のケースの様に光の当たった部分にグレアを合成した場合
あっさりこの現象は起こってしまいますね。

どうもありがとうございました。


投票数:1 平均点:0.00

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

●テストビルド
Buildbot(自動生成)


●開発関連
公式開発サイト
Blender開発blog
Blender Wiki