ページ 11

(DxLib) 色相変化+透明度変化の組み合わせ方法

Posted: 2014年10月15日(水) 01:22
by ぺりかん
初めまして。DxLibにてゲームを作成している、ぺりかんと申します。

現在ゲーム内のエフェクトを作成しているのですが、エフェクトの処理がどうしても重くなってしまい
困っているため、相談いたします。

ゲーム内で使用する画像を、時間経過とともに
最初は画像を白塗りにする+透明にする → 白塗りにした画像の色を元に戻していく+透明度を下げる(表示を濃くする)
としたいと考えています。
そこで、下記のように実装しました。

コード:

int cnt = 0;
while( ProcessMessage()など ){
    // まず、色が白色のまま濃さを強くしていく
    // INVSRC側とADD側の強さが同じなら白色になる。
    // また強さcntが小さいほど透明、大きいほど非透明になる
  if(cnt < 100){
        SetDrawBlendMode(DX_BLENDMODE_INVSRC, cnt * 3);
        DrawGraph(x, y, handle, TRUE);
        SetDrawBlendMode(DX_BLENDMODE_ADD, cnt * 3);
        DrawGraph(x, y, handle, TRUE);
    }
    // ある程度濃くなったら、画像に少しずつ色をつけていく
    // INVSRC側とADD側の強さの差分がカラーになる
    else if(cnt < 200){
        SetDrawBlendMode(DX_BLENDMODE_INVSRC, 255 - cnt);
        DrawGraph(x, y, handle, TRUE);
        SetDrawBlendMode(DX_BLENDMODE_ADD, 255);
        DrawGraph(x, y, handle, TRUE);
    }
    // ある程度色がついたら、色の調整を行う
    // 最終的にはNOBLENDで描画したいが、
    // ADDで描画するとNOBLENDより鮮やかになってしまうので、
    // NOBLENDに切り替えた際に違和感がないよう、ゆるやかに色をNOBLENDに近づけていく
    else if(cnt < 255){
        SetDrawBlendMode(DX_BLENDMODE_INVSRC, 255 - cnt - 10);
        DrawGraph(x, y, handle, TRUE);
        SetDrawBlendMode(DX_BLENDMODE_ADD, 255 - 10);
        DrawGraph(x, y, handle, TRUE);
    }
    // 色のフェードが完了したらNOBLENDで描画
    else{
        DrawGraph(x, y, handle, TRUE);
    }
    cnt++;

    // フェード対象以外の画像をNOBLENDで描画
    SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
    DrawGraph(_x, _y, other_img, TRUE);
}
こうすることで概ね希望通りの動作をするのですが、実際は10個の画像をタイミングをずらして
フェードをかける必要があります。(処理をまとめてSetDrawBlendModeの回数を減らすことができません)
画像が1枚なら1フレームにつきSetDrawBlendMode()を2回 + 1回(NOBLENDに戻す分) で済みますが、
画像が10枚になると、2回 * 10枚 + 1回 = 21回 のSetDrawBlendMode()が必要になってしまい
結果としてフェードの表示中、画面がガクガクしてしまいます。

目的の「画像を白塗りにする+透明にする」という処理にSetDrawBlendModeのような
重い処理を2回も使いたくない、というのが本音なのですが、
もう少し軽く、かつ簡潔に記述する方法は無いでしょうか。
また、今回は仕方なく濃さによって処理を4段階に分けていますが、可能であれば
処理の段階を減らし、かつ より滑らかに表示を変化させたいと思います。
(白色状態で濃さを変化→色を鮮やかにしていく→調整 のプロセスが分離しているため、
正しい意味で滑らかに変化しているわけではありません。
見た目には、ある程度滑らかに変化しているように見えるのですが。)

宜しくお願いします。

Re: (DxLib) 色相変化+透明度変化の組み合わせ方法

Posted: 2014年10月15日(水) 07:50
by みけCAT
INVSRC+ADDと同様の結果が得られるかはわかりませんが、ピクセルシェーダーが使えないでしょうか?

Re: (DxLib) 色相変化+透明度変化の組み合わせ方法

Posted: 2014年10月15日(水) 08:28
by ookami
>画像が10枚になると、2回 * 10枚 + 1回 = 21回 のSetDrawBlendMode()が必要になってしまい
>結果としてフェードの表示中、画面がガクガクしてしまいます。

上記の描画の部分をまるごとコメントアウトした時と比較しても、FPSが明らかに(60FPSから30FPSなど)下がるのでしょうか?
SetDrawBlendMode()自体はぜんぜん重い処理ではないはずなので、何か描画以外に重い処理を入れてしまっていないでしょうか?
ソース全体を貼ってもらった方がよい気がするのですが...