描画がうまくいかない

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

描画がうまくいかない

#1

投稿記事 by Suikaba » 13年前

コード:

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

Suikaba
記事: 194
登録日時: 13年前

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

#2

投稿記事 by Suikaba » 13年前

ちなみに

コード:

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を返します。

アバター
うしお
記事: 56
登録日時: 13年前

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

#3

投稿記事 by うしお » 13年前

行列の設定はどうなっていますか?
IDirect3DDevice9::SetTransformにて
D3DTS_WORLD
D3DTS_VIEW
D3DTS_PROJECTION
に設定された行列のミスによりずれているのではないでしょうか?
検証してみてください

Suikaba
記事: 194
登録日時: 13年前

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

#4

投稿記事 by Suikaba » 13年前

SetTransformしてないですね・・・
しないとだめなんですか?

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

アバター
うしお
記事: 56
登録日時: 13年前

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

#5

投稿記事 by うしお » 13年前

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

Suikaba
記事: 194
登録日時: 13年前

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

#6

投稿記事 by Suikaba » 13年前

了解です。
ありがとうございます。

Suikaba
記事: 194
登録日時: 13年前

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

#7

投稿記事 by Suikaba » 13年前

うーん。
描画の位置ではなく、テクスチャのサイズが変わってしまうのが問題なんですけど、それとも関係あるんですか?

しひ

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

#8

投稿記事 by しひ » 13年前

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

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

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

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

#9

投稿記事 by ISLe » 13年前

デバイスが2の累乗でないテクスチャーをサポートしていても、ミップマップが有効だとサイズの補正が入ります。

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

匿名希望の774さん

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

#10

投稿記事 by 匿名希望の774さん » 13年前

頂点変換済み座標で表示はしないのですよね?
もし頂点変換済み座標を使うならrhwが必要になります

Suikaba
記事: 194
登録日時: 13年前

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

#11

投稿記事 by Suikaba » 13年前

回答どうもです。

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

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

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


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

Suikaba
記事: 194
登録日時: 13年前

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

#12

投稿記事 by Suikaba » 13年前

ミップマップレベルを1にしたところ成功しました!!
本当にありがとうございました!これで製作のほうもはかどります!

閉鎖

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