動的なテクスチャの作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いなみや
記事: 2
登録日時: 13年前

動的なテクスチャの作成について

#1

投稿記事 by いなみや » 13年前

こんにちは初めて質問させていただくいなみやといいます。

自分は複数のテクスチャから一枚のテクスチャを制作して使いまわす
というようなことをしたいのですがやり方が分からず困っています。

具体的にはゲームのステータス画面などにおける数値の描画についてです。

現在、自分は一つの文字列を一つのテクスチャとして作成することは出来るのですが
そのやり方だと数十項目の数値あった場合
毎フレームその枚数だけテクスチャを描画しなければならないので重たくなってしまいます。
なので比較的静的な要素についてはひとつのテクスチャ(サーフェス?)にまとめておきたいと考えています。

一応自分でも調べてみて以下の様なコードを書いてみたのですがうまくいきませんでした。

最近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);
};

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

Re: 動的なテクスチャの作成について

#2

投稿記事 by ISLe » 13年前

UV指定でテクスチャの一部を使って描画すればいちいちテクスチャを切り替えずに済むと思いますし、オフスクリーンを使う必要もないと思います。
数値くらいならあらかじめ用意できるので、システムフォントを使うのでもなければテクスチャを動的に作成する必要ないですし。

なんだかとても無駄なことをしているコードに見えます。
提示されたコードは手順を示しているだけで、どうしてこのようなコードが必要なのかは分からないので、無駄だと断言することはできないですけど。

例えば適当なint型に代入した数値を画面に表示するだけの、そのままコンパイルすれば動作するような完結したコードを作っていただくことはできませんか。
テクスチャ(test.bmp)の中のイメージがどうなっているのかも教えてください。

いなみや
記事: 2
登録日時: 13年前

Re: 動的なテクスチャの作成について

#3

投稿記事 by いなみや » 13年前

ISLeさん返信ありがとうございます。
どうやら自分の書き方が悪かったようで混乱させてしまったようです。
現在ファイルの編集をしているのでもう少しお待ちいただけるでしょうか。
よろしくお願いします。

・追記
大変遅くなってしまいすいません。
編集していたらバグのせいで文字がうまく表示されなくなってしまいました。
動かないものを上げるのは人としてどうなのかとも思いますが、とりあえず形だけでもということで上げさせていただきました。
よろしくお願いします。

・さらに追記
自分の言いたかったことをDQやFFの戦闘画面の名前欄で例えてみると、仮に味方のキャラクターが4人いる場合、毎フレームメッセージウィンドウの描画の上にさらにキャラクター4人の名前がそれぞれ描画され最低5回の描画が必要になると思いました。
しかし、仮に一度バッファに描画したものを使いまわせるのならその後はそのバッファの描画一度だけで済むことになり効率的になると考えたのです。

描画の効率化としてはあらかじめチップを用意してuv値だけを動かすやり方は知っていたのですが
仮に画面上でほとんど動かない何十個かの要素があったとして、それらを毎フレーム何十回も描画するくらいなら一度の描画で終わられたらなーと思い質問してみました。(うまく書けなかったけど)

しかし弾幕ゲーのようなものもありますし少々気にしすぎなような気もしてきました。
いずれにせよ自分の勉強不足のようなので出直してくることにします。
添付ファイル
動的なテクスチャについて.zip
ちゃんと動かないです。ごめんなさい。
(11.86 KiB) ダウンロード数: 130 回

閉鎖

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