プロが教えるわが家の防犯対策術!

Directxの質問なのですがある色だけ透明にするにはどうしたらいいのでしょうか?
void Draw(ID3DXSprite* g_pSprite,DDXTEX* g_pTexture)
{
// クリア
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
g_clrBackgroundColor, 1.0f, 0);

// 描画開始
if (FAILED(g_pd3dDevice->BeginScene())) {
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
return;
}

// スプライトを描画
g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
g_pSprite->Draw(
g_pTexture->m_pTexture, // LPDIRECT3DTEXTURE9 pTexture
NULL, // CONST RECT *pSrcRect
&g_vCenter, // CONST D3DXVECTOR3 *pCenter
NULL, // CONST D3DXVECTOR3 *pPosition
g_pTexture->m_clrAlpha // D3DCOLOR Color
);
g_pSprite->SetTransform(&g_mat);
g_pSprite->End();

// シーン描画の終了とバックバッファからの表示
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
g_pTexture->m_clrAlphaで半透明するはずだとは思うのですが。できません。わかる方いらしたらご教授のほどよろしくお願いします。

A 回答 (5件)

最近のDirectXを触っていないので間違っているかもしれませんが。



g_pTexture->m_clrAlphaは、D3DCOLOR型ですよね。
値は、D3DCOLOR_ARGB()マクロ等で設定していますか?
D3DCOLOR_ARGB(30,0,0,0)とかすればスプライトは殆ど透明化するはずですが。

この回答への補足

D3DCOLOR_XRGBマクロはしていました。
D3DCOLOR_ARGB(30,0,0,0)をやっても透明化しませんでした。
HRESULT ReadBMP(ID3DXSprite** g_pSprite,LPCTSTR lpszFilename,DDXTEX* g_pTexture)
{
HRESULT hr = S_FALSE;
UINT uLevel = 0;
IDirect3DSurface9* pSurface = NULL;

lstrcpy(g_pTexture->m_Filename,lpszFilename);
g_pTexture->m_clrAlpha=g_colorKey;
g_pTexture->m_pTexture=NULL;
// スプライト情報の生成
if (SUCCEEDED(hr))
hr = ::D3DXCreateSprite(g_pd3dDevice, g_pSprite);
if (SUCCEEDED(hr))
hr = ::D3DXCreateTextureFromFile(g_pd3dDevice, g_pTexture->m_Filename, &g_pTexture->m_pTexture);
if (SUCCEEDED(hr))
hr = g_pTexture->m_pTexture->GetSurfaceLevel(uLevel, &pSurface);

// サーフェイス取得
if (SUCCEEDED(hr))
hr = pSurface->GetDesc(&g_sSurfaceInfo);
if (pSurface != NULL)
pSurface->Release();
pSurface = NULL;

// 失敗したら破棄
if (FAILED(hr))
DestroySplite(*g_pSprite,g_pTexture);

return hr;
}
のどこかがいけないのでしょうか?

補足日時:2009/04/13 22:48
    • good
    • 0

うーん。

分りません。
とりあえず、SetTransform()を止めてみるとか、g_pTexture->m_clrAlphaを止めて直接D3DCOLOR_ARGB(30,0,0,0)を書いてみるとか。色々試してみてください。
シンプルな形でもし表示できたら逆にたどってうまくいかない原因をつぶすのがバグ退治の基本です。

それと、SetTransform()の位置が変じゃないでしょうか?
Begin()前じゃないとTransformが即反映されない気がするんですが。

この回答への補足

試したり探してみたのですが、見つかりませんでした。SetTransform()もやってみたのですが駄目でした。
// デバイス初期化
HRESULT
InitializeD3D(HWND hWnd)
{
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE dmode;

// D3Dオブジェクトの作成
g_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION);

// 現在のディスプレイモードを取得
::ZeroMemory(&d3dpp, sizeof(d3dpp));
hr = g_pD3D->GetAdapterDisplayMode(g_nAdapter, &dmode);
if (FAILED(hr)) return hr;

// パラメータの設定
d3dpp.Windowed = TRUE; // ウィンドウモードで表示
d3dpp.SwapEffect = g_dwSwapEffect;
d3dpp.BackBufferFormat = dmode.Format; // デスクトップのフォーマットを使用
d3dpp.BackBufferCount = 2; // トリプルバッファリングを行う
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 16Bit Zバッファ作成

// IDirect3DDevice9オブジェクトの作成
hr = g_pD3D->CreateDevice(g_nAdapter, g_dwDeviceType,
hWnd, g_dwBehaviorFlags,
&d3dpp, &g_pd3dDevice);
if (FAILED(hr)) return hr;

return S_OK;
}

// デバイスの解放
void FinalizeD3D()
{
// IDirect3DDevice9オブジェクトの解放
if (g_pd3dDevice != NULL)
g_pd3dDevice->Release();
g_pd3dDevice = NULL;

// IDirect3D9オブジェクトの解放
if (g_pD3D != NULL)
g_pD3D->Release();
g_pD3D = NULL;
}
HRESULT ReadBMP(ID3DXSprite** g_pSprite,LPCTSTRlpszFilename,DDXTEX* g_pTexture)

 /*省略*/

// スプライト破棄
void DestroySplite(ID3DXSprite* g_pSprite,DDXTEX* g_pTexture)
{
if (g_pTexture->m_pTexture != NULL)
g_pTexture->m_pTexture->Release();
g_pTexture = NULL;
if (g_pSprite != NULL)
g_pSprite->Release();
g_pSprite = NULL;
}

// 変換行列の設定
void SetMatrix(HWND hWnd)
{
RECT rc={0,0,0,0};
FLOAT x, y;

::D3DXMatrixIdentity(&g_mat);

// ウィンドウサイズにスプライトの大きさをあわせる
::GetWindowRect(hWnd, &rc);

x = (FLOAT)(rc.right - rc.left) / g_sSurfaceInfo.Width;
y = (FLOAT)(rc.bottom - rc.top) / g_sSurfaceInfo.Height;


// 拡縮させる
::D3DXMatrixScaling(&g_mat, x, y, 0.0f);
}

補足日時:2009/04/14 16:30
    • good
    • 0

そういえば、g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE); が必要かも知れません。


BeginScene()の後に入れてみてください。
    • good
    • 0
この回答へのお礼

入れてみたのですが、駄目でした。
RECT rect={0,0,1020,480};
とやるとうまくいくのですが、サイズは 描画本体は680X460なのでおかしいのですが・・・描画の透明化も変わらずです。

お礼日時:2009/04/14 17:40

 こんにちは。


 要はカラーキーを指定したいのでしょうか。

 http://msdn.microsoft.com/ja-jp/library/cc372753 …

 テクスチャをロードする時、透明にしたい色彩を指定しないと出来ない様です。
 右から4番目のパラメータに、0xFFRRGGBBでもって消したい色彩を指定します。
 例えば、緑色を消したければ、0xFF00FF00と言う事です。

 以下の例はサイズが640x480、黒が透明の1枚から成るテクスチャを作成します。
 ::D3DXCreateTextureFromFileEx(g_pd3dDevice, lpszFilename, 640, 480, 1, D3DUSAGE_RENDERTARGET, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0xff000000, NULL, NULL, &g_pTexture);
    • good
    • 0
この回答へのお礼

できました!感動的です!g_pSprite->Drawの5番目の引数は透明化するわけではないのですね。そこで質問なのですが、g_pSprite->Drawの5番目の引数は何の意味があるのでしょうか?
あと::D3DXCreateTextureFromFile(g_pd3dDevice, g_pTexture->m_Filename, &g_pTexture->m_pTexture);
ではなぜ駄目だったのでしょうか。

お礼日時:2009/04/14 18:10

 こんばんは。



・g_pSprite->Drawの5番目の引数は透明化するわけではないのですね。そこで質問なのですが、g_pSprite->Drawの5番目の引数は何の意味があるのでしょうか?
 此れはアルファブレンディングと言って、テクスチャ全体(スプライト)とシーンの色彩を半透明で合成する為の物です(幽霊みたいに透ける)。

・::D3DXCreateTextureFromFile(g_pd3dDevice, g_pTexture->m_Filename, &g_pTexture->m_pTexture);ではなぜ駄目だったのでしょうか。
 此れに関しては「簡易版の関数で詳細設定が出来ない代わりにパラメータが少なくて呼び出しやすい」程度に捕らえておけば良いと思います。
 windows系関数の幾つかには、簡易版と詳細版(関数名の先頭か末尾にExが付く)の二つが存在します。
    • good
    • 0
この回答へのお礼

そうだったんですか!回答ありがとうございました。

お礼日時:2009/04/15 01:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!