動的なテクスチャの作成について
Posted: 2013年3月08日(金) 13:48
こんにちは初めて質問させていただくいなみやといいます。
自分は複数のテクスチャから一枚のテクスチャを制作して使いまわす
というようなことをしたいのですがやり方が分からず困っています。
具体的にはゲームのステータス画面などにおける数値の描画についてです。
現在、自分は一つの文字列を一つのテクスチャとして作成することは出来るのですが
そのやり方だと数十項目の数値あった場合
毎フレームその枚数だけテクスチャを描画しなければならないので重たくなってしまいます。
なので比較的静的な要素についてはひとつのテクスチャ(サーフェス?)にまとめておきたいと考えています。
一応自分でも調べてみて以下の様なコードを書いてみたのですがうまくいきませんでした。
最近DirectXを触り始めたばかりなので見当はずれな質問かもしれませんが
よろしくお願いします。
自分は複数のテクスチャから一枚のテクスチャを制作して使いまわす
というようなことをしたいのですがやり方が分からず困っています。
具体的にはゲームのステータス画面などにおける数値の描画についてです。
現在、自分は一つの文字列を一つのテクスチャとして作成することは出来るのですが
そのやり方だと数十項目の数値あった場合
毎フレームその枚数だけテクスチャを描画しなければならないので重たくなってしまいます。
なので比較的静的な要素についてはひとつのテクスチャ(サーフェス?)にまとめておきたいと考えています。
一応自分でも調べてみて以下の様なコードを書いてみたのですがうまくいきませんでした。
最近DirectXを触り始めたばかりなので見当はずれな質問かもしれませんが
よろしくお願いします。
void Create_dTex(LPDIRECT3DTEXTURE9& mTex){ //書き込まれる方のテクスチャ
LPDIRECT3DTEXTURE9 mdrawTex = NULL; //書き込む方のテクスチャ
LPDIRECT3DSURFACE9 mSurface = NULL; //テクスチャから取得するサーフェス
LPDIRECT3DSURFACE9 mZbuffer = NULL; //テクスチャ用のZバッファ
LPDIRECT3DSURFACE9 window = NULL; //現在のバックバッファ
LPDIRECT3DSURFACE9 z_window = NULL; //現在のZバッファ
D3DXCreateTextureFromFileEx(p3dDevice, TEXT("test.bmp"),0,0,0,0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_DEFAULT,
0x00000000,NULL,NULL,&mdrawTex); //書き込む方のテクスチャの作成
D3DXCreateTexture(p3dDevice, 512, 512, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &mTex); //書き込まれる方のテクスチャを作成
p3dDevice->CreateDepthStencilSurface(512,512,D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, TRUE, &mZbuffer, NULL); //ステンシルバッファも作成
p3dDevice->GetRenderTarget(0, &window); //現在のバックバッファを取得して退避させる
p3dDevice->GetDepthStencilSurface(&z_window); //現在のZバッファを取得して退避させる
mTex->GetSurfaceLevel(0, &mSurface); //テクスチャからサーフェス情報を取得する
p3dDevice->SetRenderTarget(0, mSurface); //テクスチャをレンダリングターゲットに設定
p3dDevice->SetDepthStencilSurface(mZbuffer); //テクスチャのZバッファを設定
p3dDevice->EndScene();
p3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);//テクスチャを一度クリア
p3dDevice->BeginScene();
//テクスチャステージの設定
p3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
p3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
p3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
p3dDevice->SetTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
p3dDevice->SetTextureStageState(1,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
p3dDevice->SetTextureStageState(1,D3DTSS_ALPHAARG2,D3DTA_CURRENT);
//描画開始
p3dDevice->SetVertexDeclaration(decl);
p3dDevice->SetStreamSource(0, pVertex, 0, sizeof(Vtx));
// シェーダー開始
UINT numPass = 0;
effect->SetTechnique("Tech");
effect->Begin(&numPass, 0);
effect->BeginPass(0);
//描画
p3dDevice->SetTexture(0, mTex);
p3dDevice->SetTexture(1, mdrawTex);
D3DXMatrixScaling(&localScale, 512.0f, 512.0f, 0.0f);
D3DXMatrixTranslation(&localOffset, 0.0f,0.0f, 0.0f);
world = localScale*localOffset;
/*シェーダーの変数設定は省略しました*/
effect->CommitChanges();
p3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
effect->EndPass();
effect->End();
p3dDevice->SetRenderTarget(0, window); //レンダリングターゲットを元に戻す
p3dDevice->SetDepthStencilSurface(z_window); //Zバッファも元に戻す
window->Release(); //参照カウントを元に戻す
z_window->Release();//参照カウントを元に戻す
mdrawTex->Release();
SAFE_RELEASE(mSurface);
SAFE_RELEASE(mZbuffer);
};