
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で半透明するはずだとは思うのですが。できません。わかる方いらしたらご教授のほどよろしくお願いします。
No.5ベストアンサー
- 回答日時:
こんばんは。
・g_pSprite->Drawの5番目の引数は透明化するわけではないのですね。そこで質問なのですが、g_pSprite->Drawの5番目の引数は何の意味があるのでしょうか?
此れはアルファブレンディングと言って、テクスチャ全体(スプライト)とシーンの色彩を半透明で合成する為の物です(幽霊みたいに透ける)。
・::D3DXCreateTextureFromFile(g_pd3dDevice, g_pTexture->m_Filename, &g_pTexture->m_pTexture);ではなぜ駄目だったのでしょうか。
此れに関しては「簡易版の関数で詳細設定が出来ない代わりにパラメータが少なくて呼び出しやすい」程度に捕らえておけば良いと思います。
windows系関数の幾つかには、簡易版と詳細版(関数名の先頭か末尾にExが付く)の二つが存在します。
No.4
- 回答日時:
こんにちは。
要はカラーキーを指定したいのでしょうか。
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);
できました!感動的です!g_pSprite->Drawの5番目の引数は透明化するわけではないのですね。そこで質問なのですが、g_pSprite->Drawの5番目の引数は何の意味があるのでしょうか?
あと::D3DXCreateTextureFromFile(g_pd3dDevice, g_pTexture->m_Filename, &g_pTexture->m_pTexture);
ではなぜ駄目だったのでしょうか。
No.3
- 回答日時:
そういえば、g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE); が必要かも知れません。
BeginScene()の後に入れてみてください。
入れてみたのですが、駄目でした。
RECT rect={0,0,1020,480};
とやるとうまくいくのですが、サイズは 描画本体は680X460なのでおかしいのですが・・・描画の透明化も変わらずです。
No.2
- 回答日時:
うーん。
分りません。とりあえず、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);
}
No.1
- 回答日時:
最近の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;
}
のどこかがいけないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- Perl 画像が表示でnull; this.src 1 2022/04/19 11:31
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windowのちらつき防止
-
pset関数について
-
TextBoxに文字を書いても表示さ...
-
.net の ImageList について
-
OpenGLでの描画のタイミング
-
MFCタブコントロールのグラデー...
-
C# ラバーバンドの描画を快適に...
-
Spreadで表全体を選択した場合...
-
GetGlyphOutline() ご利用経験...
-
panelのスクロール表示について
-
アプリケーションのデザイン
-
NVIDIAのシェーダーキャッシュ
-
ワイプ表示について。
-
win32api 画面のちらつき
-
CDC(LineTo)で描画した線を透過...
-
透視投影図形の回転
-
CStaticコントロールの静的イメ...
-
VB6,リストボックスの特定行の...
-
SHGetFileInfoでアイコンが取得...
-
ワード2019 描画ツールの書式が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
Labelの文字をスクロールする際...
-
UpdateData( FALSE); による文...
-
VBAにGDI+を参照させる方法
-
CStaticコントロールの静的イメ...
-
FlexGridの一部のみ表示を更新...
-
Form1 Load で実行されない。
-
VB.netでのライン描画方法がわ...
-
重いグラフィックス処理
-
InvalidateRectの使い方について
-
SHGetFileInfoでアイコンが取得...
-
OneNote 2010 文字と描画がずれる
おすすめ情報