DirectX9で画像を表示できません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ゴンマサ

DirectX9で画像を表示できません

#1

投稿記事 by ゴンマサ » 8年前

お世話になっております。
DirectXを使用し、スプライト機能を使用して画像を表示しようとしているのですがうまくいきません。
塗りつぶしは出来たのですが、画像を表示しようとすると、塗りつぶしもできなくなってしまいます。

以下がコードになります。
宜しくお願い致します。

コード:

#define NAME "DirectX勉強中"
#include <Windows.h>
#include <d3dx9.h>

// ライブラリのリンク
#pragma once
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

// #define & 構造体の定義
#define SAFE_RELEASE(x) if(x)  { x->Release(); x=NULL; }

HWND                    g_hWnd = NULL;      // Window Handle
LPDIRECT3D9             g_pD3D = NULL;     //インターフェイスの取得のためのポインタの作成(構造体)
LPDIRECT3DDEVICE9       g_pDEV = NULL;      // 描写用デバイス(インターフェイス)

LPDIRECT3DTEXTURE9 pTexture;//背景のテクスチャハンドル
LPD3DXSPRITE pSprite;//スプライトハンドル
LPDIRECT3DTEXTURE9 pSrcTexture;	//スプライトに使うテクスチャ

D3DDISPLAYMODE          d3ddm;//画面モード
D3DPRESENT_PARAMETERS   d3dpp;//インターフェイスの取得のためのポインタの作成


//テクスチャの作成
HRESULT textureCreate()
{
	HRESULT hr;//ハンドル
	/*簡易版のテクスチャの作成~
	1.使用するデバイス、
	2.使用する画像ファイル、
	3.作成されたテクスチャを受け取るポインタ*/
	hr = D3DXCreateTextureFromFile(g_pDEV,"背景.png",&pTexture);
	if(FAILED(hr))
		return false;
		return S_OK;
}

//スプライトの作成
HRESULT spriteCreate()
{
	HRESULT hr;//ハンドル
	hr = D3DXCreateSprite(g_pDEV,&pSprite);//1.使用するデバイス、2.受け取る変数
	if(FAILED(hr))
	return false;
	return S_OK;
}

//スプライトの描画
HRESULT drawsprite()
{
	//塗りつぶし
	g_pDEV->Clear(0, NULL, (D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER), 

D3DCOLOR_RGBA(200,100,255,0), 1.0f, 0);
	HRESULT hr;//ハンドル
	g_pDEV->BeginScene();//スプライトシーンの開始




///////////////////////////////////////////////////////////////////////////////////////////////
	//スプライトの描画開始--これがあると塗りつぶしが無効になる
	pSprite->Begin(D3DXSPRITE_ALPHABLEND|D3DXSPRITE_DONOTSAVESTATE);//


	RECT SrcRect = {0,0,128,32};	//テクスチャ内の使用範囲
	D3DXVECTOR3 Center(64,49,0);	//スプライト内の中心
	D3DXVECTOR3 Position(320,240,0);//スプライトを表示する位置

	hr = pSprite->Draw(pSrcTexture,
					   &SrcRect,
					   &Center,
					   &Position,
					   D3DCOLOR_ARGB(128,128,128,128));

	if(FAILED(hr))
	return false;

	pSprite->End();//スプライトを描画して終了
////////////////////////////////////////////////////////////////////////////////




	g_pDEV->EndScene();//シーンを終了
	return g_pDEV->Present(NULL, NULL, NULL, NULL);
	return S_OK;
}



//初期化処理
HRESULT Init3DDev()
{

	//構造体の設定

	//インターフェイスの取得
    if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))    return E_FAIL;

    if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))   return E_FAIL;

	//D3DPRESENT_PARAMETERS構造体の設定
    ZeroMemory(&d3dpp,sizeof(d3dpp));
    d3dpp.Windowed                  = TRUE;        // ウィンドウモード
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;      // 映像信号に同期してフリップする
	d3dpp.BackBufferFormat          = d3ddm.Format;// カラーモードの指定
    d3dpp.EnableAutoDepthStencil    = TRUE;        // デプスバッファ(Zバッファ)とステンシルバッファを作成
	d3dpp.AutoDepthStencilFormat    = D3DFMT_D16;  // デプスバッファとして16bitを使う
    

	//デバイスの作成:CreateDeviceの実行
    if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWnd,
									D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pDEV)))

	return E_FAIL;
	return S_OK;
}

//ビューポートの作成
HRESULT Viewport()
{
	HRESULT hr;//ハンドル

	//ビューポートの作成
	D3DVIEWPORT9 vp;
	vp.X = 0;
	vp.Y = 0;
	vp.Width = d3dpp.BackBufferWidth;
	vp.Height = d3dpp.BackBufferHeight;
	vp.MinZ = 0.0f;
	vp.MaxZ = 1.0f;
	hr = g_pDEV -> SetViewport(&vp);

	if(FAILED(hr))
	return false;
	return S_OK;

}


// DirectX Graphics の終了処理
void Cleanup(void)
{
    SAFE_RELEASE(g_pDEV);
    SAFE_RELEASE(g_pD3D);
}

// ウィンドウ処理(自分で処理したときは 0 を返す)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam)
{
    switch(msg)
    {   case WM_DESTROY:
            Cleanup();
            PostQuitMessage(0);
            break;
        case WM_KEYDOWN:
            switch(wParam)
            {   case VK_ESCAPE:
                    DestroyWindow(hWnd);
                    break;
            }
            break;
        default:
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}

//★ WinMain()
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{   
	MSG         msg;

    WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0, 
                      hInst,NULL,NULL,NULL,NULL,NAME,NULL
                    };
    if (!RegisterClassEx(&wc))  return FALSE;

    g_hWnd= CreateWindowEx(0,NAME,NAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
						   CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);

    if (!g_hWnd)  return FALSE;

    // DirectX Graphics の初期化
    if (FAILED(Init3DDev()))    return FALSE;

    // ウインドウ表示
    ShowWindow(g_hWnd, SW_SHOWNORMAL);
    UpdateWindow(g_hWnd);
    // メッセージ・ループ
    ZeroMemory(&msg,sizeof(msg));

	textureCreate();//テクスチャの作成
	spriteCreate();//スプライトの作成
	Viewport();//ビューポートの作成

	//ループ
    while(msg.message!=WM_QUIT)
    {  
		//プロシージャ
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {   TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else drawsprite();

    }
    UnregisterClass(NAME, hInst);
    return  TRUE;
}

 

ゴンマサ

Re: DirectX9で画像を表示できません

#2

投稿記事 by ゴンマサ » 8年前

追記:
作業環境はWindows7、Visual C++ 2010 Express、DirectX9になります。
宜しくお願い致します。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: DirectX9で画像を表示できません

#3

投稿記事 by ISLe » 8年前

画像を読み込んで作成したテクスチャはpTextureなのに、pSrcTextureで描画しようとしています。

ビューポートの設定に使っているd3dpp.BackBufferWidth,d3dpp.BackBufferHeightには値が入っていない(ウィンドウモードでデバイス作成するとき使用されない)のでデバイス作成後に改めて取得しなければいけません。

こちらの実験ではその2点を修正すると表示されました。

ゴンマサ

Re: DirectX9で画像を表示できません

#4

投稿記事 by ゴンマサ » 8年前

ISLe 様
返信が遅くなり大変申し訳ありませんでした。
指摘された部分を訂正したところ、画像を表示することが出来ました。
大変ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る