DDS 画像で Alph Blending する

VC++ でαチャンネル付の DDS 画像を使って、背景画像とブレンドして表示します。
DirectX で使われているαチャンネル付の DDS 画像を背景画像と Alph Blending して表示します。
DDS(DDSurface) ファイルの詳しい説明は DDS 形式の画像ファイルを作成する を参照して下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 私有ライブラリを使うので my.lib をリンクして My.h をインクルードします。
    DDS Object Class を使うので DDS.h をインクルードして下さい。
    my.lib に登録されている関数は my.h で定義していたのですが、DDS ではソースコードが長すぎるので別にしました。
    *dds が DDS Object Class の定義です。
    Object Class のソースコードは Object Class Library から取得して下さい。
    *Img が背景画像を表示する IMAGE Object Class の定義です。
    画面がチラツクので BACKBUF Object Class を使っています。
    DDSFile[] が DDS ファイルで、JPEGFile[] が背景画像のファイルです。
    rate はブレンドの度合いでタイマ割り込みで減少して行き、0.0f で背景画面だけになります。
        /*************************************************/
        /*★ DDS 画像ファイルをブレンドする    前田 稔 ★*/
        /*************************************************/
        #define     NAME    "DDS View"
        #include    "DDS.h"
        #include    "My.h"
        #pragma     once
        #pragma     comment(lib,"my.lib")
        #define     ID_TIMER    (WM_APP + 0)
    
        HINSTANCE       g_hInst;
        HWND            g_hWnd;
        DDS             *dds= NULL;        //DDS Object Class
        IMAGE           *Img= NULL;        //IMAGE Object Class
        BACKBUF         *Back= NULL;       //Back Buffer Object
        char            DDSFile[]=  "c:\\data\\ffx2s.dds";
        char            JPEGFile[]= "c:\\data\\星空.jpg";
        float           rate= 1.0f;
        
  2. CALLBACK 関数の WM_CREATE: で Object Class を生成して画像を入力します。
    画面サイズを背景画像に合わせて、タイマを設定してブレンドを開始します。
            case WM_CREATE:
                Back= new BACKBUF(hWnd);
                dds= new DDS(hWnd);
                dds->Load(DDSFile);
                Img= new IMAGE(hWnd);
                Img->LoadFile(JPEGFile);
                Img->Adjust(FALSE);
                SetTimer(hWnd,ID_TIMER,300,NULL);
                break;
        
  3. WM_PAINT: で描画する画面がチラツクので WM_TIMER: から描画します。
    rate を 0.05 ずつ減らしながら描画を繰り返し、0.0 になるとタイマを停止します。
    描画処理は Render() 関数で行います。
    右ボタンがクリックされると、rate を 1.0f に設定してブレンドを開始します。
    0.0 ~ 1.0 がブレンド係数で、0.0 で背景画像だけが表示されます。
            case WM_TIMER:
                if (rate>0)
                {   rate-= 0.05f;
                    Render(hWnd);
                }
                else
                {   rate= 0.0f;
                    KillTimer(hWnd,ID_TIMER);
                }
                break;
            case WM_LBUTTONDOWN:
                rate= 1.0f;
                SetTimer(hWnd,ID_TIMER,300,NULL);
                break;
        
  4. WM_CLOSE: では、終了前にリソースを開放して下さい。
            case WM_CLOSE:          // クローズ
                KillTimer(hWnd,ID_TIMER);
                SAFE_DELETE(dds);
                SAFE_DELETE(Img);
                SAFE_DELETE(Back);
                DestroyWindow(hWnd);
                break;
        
  5. 描画を行う Render() 関数です。
    Img->Show() で背景画像を BackBuffer に転送します。
    dds->ShowBlend() で背景画像と DDS をブレンドします。
    Back->Blt() で一挙に FrontBuffer に転送して描画します。
        void  Render(HWND hwnd)
        {
            Img->Show(Back->hBackDC);
            dds->ShowBlend(Back->hBackDC,40,40,rate);
            Back->Blt();
        }
        
  6. WinMain() は何時もと同じようにウインドウを表示するだけです。

【演習】

  1. プログラムを完成させて下さい。
  2. dxtex.exe で αチャンネル付きの画像(DDS)を作成して下さい。
    画像の作成方法は DDS 形式の画像ファイルを作成する を参照して下さい。
  3. 背景画像と DDS 画像を組み合わせてゲームの FadeIN や FadeOUT シーンを作成して下さい。

超初心者のプログラム入門(Win32API C++)