- ベストアンサー
描画を透明にする方法
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で半透明するはずだとは思うのですが。できません。わかる方いらしたらご教授のほどよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 ・g_pSprite->Drawの5番目の引数は透明化するわけではないのですね。そこで質問なのですが、g_pSprite->Drawの5番目の引数は何の意味があるのでしょうか? 此れはアルファブレンディングと言って、テクスチャ全体(スプライト)とシーンの色彩を半透明で合成する為の物です(幽霊みたいに透ける)。 ・::D3DXCreateTextureFromFile(g_pd3dDevice, g_pTexture->m_Filename, &g_pTexture->m_pTexture);ではなぜ駄目だったのでしょうか。 此れに関しては「簡易版の関数で詳細設定が出来ない代わりにパラメータが少なくて呼び出しやすい」程度に捕らえておけば良いと思います。 windows系関数の幾つかには、簡易版と詳細版(関数名の先頭か末尾にExが付く)の二つが存在します。
その他の回答 (4)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 要はカラーキーを指定したいのでしょうか。 http://msdn.microsoft.com/ja-jp/library/cc372753.aspx テクスチャをロードする時、透明にしたい色彩を指定しないと出来ない様です。 右から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);
お礼
できました!感動的です!g_pSprite->Drawの5番目の引数は透明化するわけではないのですね。そこで質問なのですが、g_pSprite->Drawの5番目の引数は何の意味があるのでしょうか? あと::D3DXCreateTextureFromFile(g_pd3dDevice, g_pTexture->m_Filename, &g_pTexture->m_pTexture); ではなぜ駄目だったのでしょうか。
- zwi
- ベストアンサー率56% (730/1282)
そういえば、g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE); が必要かも知れません。 BeginScene()の後に入れてみてください。
お礼
入れてみたのですが、駄目でした。 RECT rect={0,0,1020,480}; とやるとうまくいくのですが、サイズは 描画本体は680X460なのでおかしいのですが・・・描画の透明化も変わらずです。
- zwi
- ベストアンサー率56% (730/1282)
うーん。分りません。 とりあえず、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); }
- zwi
- ベストアンサー率56% (730/1282)
最近の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; } のどこかがいけないのでしょうか?
お礼
そうだったんですか!回答ありがとうございました。