ホーム > サンプルプログラム > ガンマコントロール

/*------------------------------------------------------------
    DirectX Graphics サンプルプログラム

    2007 Copyright(C) Toru

    ToruのDirectXプログラミング講座
        URL  : http://toruweb.web.fc2.com/
        Mail : toru_website@hotmail.com
--------------------------------------------------------------*/
#define STRICT


// インクルード
#include 
#include 
#include 
#include 


// インターフェイス解放
#define RELEASE(x)  if(x){x->Release();x=NULL;}


// アプリケーション情報
HINSTANCE   g_hInst;
HWND        g_hWnd;
char        g_szAppName[]   = "DirectX Graphics Sample";
UINT        g_uWidth        = 640;      // ウインドウサイズ・幅
UINT        g_uHeight       = 480;      // ウインドウサイズ・高さ


// DirectX9 Graphicsの変数
LPDIRECT3D9         g_lpD3D         = NULL;
LPDIRECT3DDEVICE9   g_lpD3DDevice   = NULL;
LPDIRECT3DSURFACE9  g_lpBackBuffer  = NULL;
LPDIRECT3DSURFACE9  g_lpSurface     = NULL;

// ガンマ処理
INT g_nGammaCount   = 0;
INT g_nGammaMark    = 1;


// メッセージ関数の定義
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam );


// アプリケーションの初期化
BOOL    InitApp( HINSTANCE hInst, INT nCmdShow )
{
    // インスタンスハンドル保存
    g_hInst = hInst;

    // ウインドウクラスの登録
    WNDCLASS wc;
    ZeroMemory( &wc, sizeof(wc) );
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
    wc.lpszClassName    = "Main Window";
    wc.hbrBackground    = (HBRUSH)GetStockObject( WHITE_BRUSH );
    wc.hInstance        = hInst;
    wc.style            = CS_BYTEALIGNCLIENT | CS_VREDRAW|CS_HREDRAW;
    wc.lpfnWndProc      = (WNDPROC)MainWndProc;
    if( ! RegisterClass(&wc) )
    {
        DXTRACE_MSG( "ウインドウクラスの登録に失敗" );
        return FALSE;
    }

    // メインウインドウの作成
    g_hWnd = CreateWindowEx( 0, "Main Window", g_szAppName,
                             WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
                             CW_USEDEFAULT, CW_USEDEFAULT, g_uWidth, g_uHeight,
                             (HWND)NULL, (HMENU)NULL, hInst, (LPSTR)NULL);
    if( g_hWnd == NULL )
    {
        DXTRACE_MSG( "メインウインドウ作成に失敗" );
        return FALSE;
    }

    // メインウインドウの表示
    ShowWindow( g_hWnd, nCmdShow );
    UpdateWindow( g_hWnd );

    return TRUE;
}


// DirectXGraphicsの初期化
BOOL    InitDXGraphics()
{
    HRESULT hr;

    // Direct3Dオブジェクトの作成
    g_lpD3D = Direct3DCreate9( D3D_SDK_VERSION );
    if( g_lpD3D == NULL )   return FALSE;

    D3DPRESENT_PARAMETERS param;
    ZeroMemory( ¶m, sizeof(param) );
    param.BackBufferWidth   = g_uWidth;             // 解像度・幅
    param.BackBufferHeight  = g_uHeight;            // 解像度・高さ
    param.BackBufferFormat  = D3DFMT_R5G6B5;        // ピクセルフォーマット(ウインドウモード時は「D3DFMT_UNKNOWN」もしくは調べる)
    param.BackBufferCount   = 1;                    // バックバッファ1つ
    param.SwapEffect        = D3DSWAPEFFECT_DISCARD;// バックバッファを表示する方法
    param.Windowed          = FALSE;                // フルスクリーン

    // 現在のピクセルフォーマットを取得,設定
/*  D3DDISPLAYMODE mode;
    hr = g_lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &mode );
    if( FAILED(hr)) return FALSE;
    param.BackBufferFormat = mode.Format;           // ピクセルフォーマット
*/
    // デバイスの作成
    hr = g_lpD3D->CreateDevice( D3DADAPTER_DEFAULT,                 // プライマリディスプレイアダプタ
                                D3DDEVTYPE_HAL,                     // HALを利用
                                g_hWnd,                             // ウインドウハンドル
                                D3DCREATE_SOFTWARE_VERTEXPROCESSING,// ソフトウェアによる頂点処理
                                ¶m,                             // パラメータ
                                &g_lpD3DDevice );                   // 
    if( FAILED(hr)) return FALSE;


    // バックバッファを取得
    hr = g_lpD3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &g_lpBackBuffer );
    if( FAILED(hr) )    return FALSE;

    // バックバッファの状態を取得
    D3DSURFACE_DESC desc;
    g_lpBackBuffer->GetDesc( &desc );

    // 画像ファイルの情報を取得
    LPCSTR szFileName = "bg.jpg";
    D3DXIMAGE_INFO ImageInfo;
    ::ZeroMemory( &ImageInfo, sizeof(ImageInfo) );
    hr = D3DXGetImageInfoFromFile( szFileName, &ImageInfo );
    if( FAILED(hr) )    return FALSE;

    // 画像ファイル読み込み(オフスクリーンサーフェースの作成)
    hr = g_lpD3DDevice->CreateOffscreenPlainSurface( ImageInfo.Width, ImageInfo.Height, desc.Format, D3DPOOL_DEFAULT, &g_lpSurface, NULL );
    if( FAILED(hr) )    return FALSE;
    hr = D3DXLoadSurfaceFromFile( g_lpSurface, NULL, NULL, szFileName, NULL, D3DX_DEFAULT, 0, NULL );
    if( FAILED(hr) )    return FALSE;

    return TRUE;
}


BOOL    ReleaseDXGraphics()
{
    // 解放
    RELEASE( g_lpSurface );
    RELEASE( g_lpBackBuffer );
    RELEASE( g_lpD3DDevice );
    RELEASE( g_lpD3D );
    return TRUE;
}


// 終了の処理
BOOL    EndApp()
{
    return TRUE;
}


// 描画処理
BOOL    Draw()
{
    if( ! g_lpD3D )         return FALSE;
    if( ! g_lpD3DDevice )   return FALSE;

    // バックバッファをクリア
    g_lpD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 0, 0 );

    // バックバッファへ描画
    RECT SrcRect,DestRect;
    SetRect( &SrcRect,  0, 0, 320, 240 );
    SetRect( &DestRect, 0, 0, 320, 240 );
    g_lpD3DDevice->StretchRect( g_lpSurface, &SrcRect, g_lpBackBuffer, &DestRect, D3DTEXF_NONE );

    // バックバッファを表示
    g_lpD3DDevice->Present( NULL, NULL, NULL,NULL );

    // ブラックアウト
    D3DGAMMARAMP ramp;
    if( g_nGammaCount < 256 )
    {
        for( INT i=0 ; i<256 ; i++ )
        {
            ramp.red[i]     = g_nGammaCount * i;
            ramp.green[i]   = g_nGammaCount * i;
            ramp.blue[i]    = g_nGammaCount * i;
        }
    }
    // ホワイトアウト
    else
    {
        for( INT i=0 ; i<256 ; i++ )
        {
            ramp.red[i]     = 65535 - (512 - g_nGammaCount) * (255 - i);
            ramp.green[i]   = 65535 - (512 - g_nGammaCount) * (255 - i);
            ramp.blue[i]    = 65535 - (512 - g_nGammaCount) * (255 - i);
        }
    }

    // 輝度変更
    g_nGammaCount += g_nGammaMark;
    if( g_nGammaCount < 0 )
    {
        g_nGammaCount   = 0;
        g_nGammaMark    = 1;
    }
    else if(g_nGammaCount > 511)
    {
        g_nGammaCount   = 511;
        g_nGammaMark    = -1;
    }

    // ガンマ設定
    g_lpD3DDevice->SetGammaRamp( 0, D3DSGR_CALIBRATE, &ramp );

    return TRUE;
}


// ウィンドウ処理
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam )
{
    switch( msg )
    {
        case WM_PAINT:
            Draw();
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc( hWnd, msg, wParam, lParam );
    }

    return 0L;
}


// メイン
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow )
{
    MSG msg;

    // アプリケーションの初期化
    if( InitApp( hInst, nCmdShow ) )
    {
        // DirectXGraphicsの初期化
        if( InitDXGraphics() )
        {
            // メッセージループ
            while( GetMessage( &msg, 0, 0, 0 ) )
            {
                if( msg.message == WM_QUIT )    break;
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
        }
    }

    // DirectXGraphicsの終了処理
    ReleaseDXGraphics();

    // アプリケーションの終了処理
    EndApp();

    return msg.wParam;
}


inserted by FC2 system