ページ 11

描画がうまくいかない

Posted: 2011年4月24日(日) 22:42
by Suikaba

コード:

D3DXIMAGE_INFO info;
	D3DXGetImageInfoFromFile( filename, &info );
	D3DXCreateTextureFromFileEx( device, filename,
		info.Width, info.Height, 0, 0,
		D3DFMT_A1R5G5B5, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE,
		color, NULL, NULL, &m_texture_p );
	m_textureWidth = info.Width;
	m_textureHeight = info.Height;
まず、このように読み込んだテクスチャを、

コード:

//==========================================================
// 矩形の描画
//==========================================================
void Texture::DrawRect( const LPDIRECT3DDEVICE9 device,
	const float x, const float y, const float dx, const float dy,
	const float u, const float v, const float du, const float dv,
	const D3DCOLOR diffuse )
{
	// 頂点座標などの設定
	VERTEX vertex[] =
	{
		{    x,    y, 0.0f, 1.0f, diffuse,    u,    v },
		{ x+dx,    y, 0.0f, 1.0f, diffuse, u+du,    v }, 
		{ x+dx, y+dy, 0.0f, 1.0f, diffuse, u+du, v+dv },
		{    x, y+dy, 0.0f, 1.0f, diffuse,    u, v+dv }
	};

	// 描画
	device->SetFVF( D3DFVF_VERTEX );
	device->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, vertex, sizeof( VERTEX ) );
}

//==========================================================
// テクスチャの描画
//==========================================================
void Texture::Draw( const LPDIRECT3DDEVICE9 device,
	const float x, const float y, const float dx, const float dy,
	const float u, const float v, const float du, const float dv,
	const D3DCOLOR diffuse )
{
	device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
	device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
	device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
	device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
	device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
	device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
	device->SetTexture( 0, m_texture_p );
	DrawRect( device, x, y, dx, dy, u, v, du, dv, diffuse );
}
のようにして描画してみたのですが、スケーリングリングかなんかかかっててサイズが変わって表示されてしまいます。
2のn乗じゃないと勝手に換わってしますのは知っていて、読み込み時に対応できたとおもっていましたがだめでした。
どなたか解決策をお願いします。

環境
VC++ 2008使用
DirectX9.0c
Windows XP

Re: 描画がうまくいかない

Posted: 2011年4月24日(日) 22:44
by Suikaba
ちなみに

コード:

Draw( device, 0, 0, 
		m_title->GetWidth(), m_title->GetHeight(), 0, 0, 1.0f, 1.0f, D3DCOLOR_XRGB( 255, 255, 255 ) );
のように呼び出しています。
m_titleと言うのはTextureのクラスのオブジェクトです。
GetWidthとGetHeightはそれぞれ、テクスチャの幅、高さを返します。ここだと、640、480を返します。

Re: 描画がうまくいかない

Posted: 2011年4月24日(日) 23:52
by うしお
行列の設定はどうなっていますか?
IDirect3DDevice9::SetTransformにて
D3DTS_WORLD
D3DTS_VIEW
D3DTS_PROJECTION
に設定された行列のミスによりずれているのではないでしょうか?
検証してみてください

Re: 描画がうまくいかない

Posted: 2011年4月24日(日) 23:55
by Suikaba
SetTransformしてないですね・・・
しないとだめなんですか?

ちなみに、今のところ3Dを使う予定はないです。

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 00:02
by うしお
スクリーン座標表現にて任意の位置に描画するには行列変換を行うか、
座標変換済み頂点を使用する必要があります。
また2Dであってもカメラの移動など使用するメリットもあるかと思います。ご検討ください。

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 00:34
by Suikaba
了解です。
ありがとうございます。

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 00:36
by Suikaba
うーん。
描画の位置ではなく、テクスチャのサイズが変わってしまうのが問題なんですけど、それとも関係あるんですか?

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 02:08
by しひ
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
リファレンスより、第3、第4引数にD3DX_DEFAULT_NONPOW2を指定していて、
なおかつデバイスが2の累乗以外のテクスチャの読み込みをサポートしているとき、
読み込み時のサイズ変更が行われないみたいです。

単純に、読み込み時にテクスチャのサイズが変換されているだけかもしれませんね。

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 02:32
by ISLe
デバイスが2の累乗でないテクスチャーをサポートしていても、ミップマップが有効だとサイズの補正が入ります。

むかし試したことでうろ覚えですが、ミップマップレベルを1にする必要があった気がします。

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 13:16
by 匿名希望の774さん
頂点変換済み座標で表示はしないのですよね?
もし頂点変換済み座標を使うならrhwが必要になります

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 19:02
by Suikaba
回答どうもです。

>> しひさん
なるほど。そうだったんですか。
あとで詳しく見ておこうかとおもいます。
そうですね。読み込みがうまくいってないっぽいです。

>> ISLeさん
どうもありがとうございます。試してみます。
ミップマップレベルですね。

>> 匿名希望の774さん
頂点変換済み頂点ですが、つかっています。
VERTEXという構造体の中に、
float x, y, z;
float rhw;
DWORD diffuse;
float u, v;
と入っています。
ここでは、1.0fとして使っています。


みなさん回答どうもでした。
塾から帰ってきたら、早速試してみようとおもいます。

Re: 描画がうまくいかない

Posted: 2011年4月25日(月) 23:18
by Suikaba
ミップマップレベルを1にしたところ成功しました!!
本当にありがとうございました!これで製作のほうもはかどります!