• 締切済み

何故か拡大表示されます

最新版のDirectX SDKでゲームを作っています。 プログラムの勉強もつい先日始めたばかりで何もわかりませんが、よろしくお願いします。 さてお尋ねしたいのですが。 スプライトを描画したとき、何故か元のサイズより拡大されて表示されてしまうのですが、どうしてでしょうか。 48x48のddsファイルなのですが、64x64の大きさに認識されているようです。 RECTで表示領域を48x48と指定しているのですが、少し切れてしまっています。 描画するにあたっては、ごく単純なコードしか書いていません。 CTextureでファイルを読み込み、D3DXVECTOR2で位置を、、RECTで表示領域を指定。 D3DXMATRIXでマトリックスを作成し、ID3DXSpriteで描画しているだけです。 拡大して表示させるような変なコードは書いていないはずですが…

みんなの回答

  • isle
  • ベストアンサー率51% (77/150)
回答No.3

> Direct Xは2の累乗の大きさの画像しか扱えない仕様だそうです。 んなこたありません。 ミップマップが無効になるようにテクスチャをロードすれば任意のサイズが可能になります。 #ビデオカード依存だけど。 ミップマップが有効のときは >2の累乗の大きさの画像しか扱えない仕様 です。

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.2

>4,8,16,32,64,128,256,512,1024と、たったこれしか扱えないのですかね。 Yes. したがって、グラフィック容量を効率良くするために、可能な限り使用しない領域を減らす事が求められます。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

ビデオカードによっては作成するテクスチャは 8の倍数で作成される事があります。 つまり、指定されたサイズが入る最小の8の倍数64に アライメントされている可能性があります。 私はあまり詳しいほうではありませんので、 参考程度ですが、元の画像を8の倍数の大きさ(ここでは64×64)で 作成しその中に48×48の画像を描いて他の領域を透明色で 塗りつぶして読み込み、48×48の領域を転送するように調整するのが、 いいと思います。

zylput83
質問者

お礼

回答を頂く前に自己解決してしまいました。 Direct Xは2の累乗の大きさの画像しか扱えない仕様だそうです。 そして大きさが2の累乗でない場合は、拡大して2の累乗のサイズに合わせるようです。 ということは扱える画像の制約が大きくないでしょうか? 4,8,16,32,64,128,256,512,1024と、たったこれしか扱えないのですかね。

関連するQ&A

  • 描画について

    今DirectXでゲームを作ろうとしてるものですが、描画しようと思い打ったのですが位置が思い通りにならない(描画が範囲を下回っている)描画されなくて困っています。ソースはこれです。 HRESULT Render(void) { g_pD3DDevice->Clear(0, NULL,NULL, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0); // シーンの描画開始 if (SUCCEEDED(g_pD3DDevice->BeginScene())) { // スプライトの描画開始(アルファ・ブレンディング有効&デバイス状態を保存も復元もしない) pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE); // シーンの描画(2D画像の描画) RECT SrcRect = { 0,0,640,480 }; // テクスチャ内でスプライトに使う範囲(0,0)-(512,64) D3DXVECTOR3 Center(320,240,0); // スプライト内の中心の位置(256,32,0) D3DXVECTOR3 Position(320,240,0); // スプライトを表示する位置(0,0,0)+(320,240,0) static int alpha=0; pSprite->Draw(pTexture.m_texture, // スプライトに使うテクスチャ &SrcRect, // 描画範囲 &Center, // スプライト内の中心の位置 &Position, // スプライトを表示する位置 D3DCOLOR_ARGB(alpha>255?511-alpha:alpha,255,255,255)); //alpha++; alpha &= 0x1FF; //pTexture.m_colorKey); // スプライトの描画終了 pSprite->End(); // シーンの描画終了 g_pD3DDevice->EndScene(); } // シーンの表示 return g_pD3DDevice->Present(NULL, NULL, NULL, NULL); }どうしたらきちんとした位置に描画できるのでしょうか。

  • 描画位置について

    描画を透明化する質問をしたものですが、もう1つ教えていただきたいことがあります。 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(); で描画範囲がCONST RECT *pSrcRectで、描画中心がCONST D3DXVECTOR3 *pPosition、描画位置がCONST D3DXVECTOR3 *pPositionのはずなのですが描画範囲も描画中心、描画位置も思い通りいきません。 描画範囲、中心、位置を指定するにはどうすればいいのでしょうか?

  • DirectXで画像表示

    DirextXでゲームを作ってるんですがわからないことがあるんで教えてください。 背景として640×640(ピクセル)の画像を表示したくて(ウィンドウはサイズ640,640で作成) RECT from; D3DXVECTOR3 to; D3DCOLOR color; from = makeRect(0,0,640,640); to = D3DXVECTOR3(0,0,0); color = D3DCOLOR_ARGB(255,255,255,255); if(g_pTexture != NULL) g_pSprite->Draw(g_pTexture, &from, NULL, &to, color); RECT makeRect(int x, int y, int w, int h) { RECT box; box.left = x; box.top = y; box.right = w; box.bottom = h; return (box); } //g_pTexture = D3DXCreateTextureFromFileEx関数で作成したテクスチャオブジェクト。 //g_pSprite = スプライトオブジェクト。 大体こんな感じの流れで背景画像を表示したらウィンドウ全体に画像の一部分だけが拡大されて表示されました。なぜ画像全体がうまく表示されないんでしょうか? 例えば64×64のキャラクタ画像を from = makeRect(0,0,64,64); to = D3DXVECTOR3(0,0,0); で表示したら画面左上にうまく表示されました。 初心者なんであまりうまく説明できないんでかなりわかりにくいかもしれませんが、わかる方よろしくお願いします。

  • ID3DXSprite::Drawメソッドに関しての質問です。

    ID3DXSprite::Drawメソッドに関しての質問です。 Drawメソッドの第2引数は CONST RECT* と定義されており、ここに描画される有効範囲を指定します。 このRECT構造体に添付の画像の様に800x600のサイズのテクスチャを描画範囲と指定する場合、 (0,0)(800,600)と指定すると、結果的に幅は801pixl,高さは601pixlとなると考え、 (0,0)(799,599)と指定しました。しかし、この様に指定すると、実際には799x599pixlとして 描画されてしまいます。 ID3DXSprite::Drawメソッドの描画範囲を指定する第2引数は RECT.top、RECT.left は切り取り位置、 RECT.right、RECT.bottom は描画サイズと解釈するべきなのでしょうか? このあたりのことは書籍やネットでもあまり取り上げられない問題なので、 詳細をご掲示頂けると幸いです。 よろしくお願いします。

  • 描画を透明にする方法

    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で半透明するはずだとは思うのですが。できません。わかる方いらしたらご教授のほどよろしくお願いします。

  • ID3DXSprite::Drawメソッドに関して質問です。

    ID3DXSprite::Drawメソッドに関して質問です。 ID3DXSprite::Drawメソッドの第3引数でスプライトの 中心を識別する座標を指定できますが、 この座標を画像の様に中心にセットします(単に2で除算するだけですが)。 スプライト上では中心を(0,0)と扱うので、仮にこのスプライトを 左上にあわせて描画するとします。 なお、スプライトのサイズと、ウィンドウのクライアントサイズは 完全に一致しているとします。 単純に中心までの幅はX、中心までの高さはXとなりますので、 スプライトをX、Y分だけ右下にずらせば 問題なく描画されるかと思っていたのですが、 何故か画像内の結果上の様に地味に左上に描画されてしまいます。 そこで画像内の結果下の様にそれぞれにさらに0.5pixlずらして描画しますと これは想像どおりの位置で描画されます。 インターネットで調べるとテクスチャの描画の際には0.5pixl云々という記述が あるのですが、この場合でも0.5pixlのずれを意識する必要があるのでしょうか? それとも私自身、根本的に座標の求め方に問題があるのでしょうか? どうか、ご指摘お願いします。

  • DirectXのスプライト機能で3D回転

    http://oshiete1.goo.ne.jp/qa4484924.html 前回この質問をした者です。 疑問を整理して、もう一度質問させて貰います。 DirectX9.0cのスプライト機能で、X軸やY軸の回転のような3Dの変換は可能でしょうか? また前回での回答して頂いた事について一つ。 sprite->Begin(D3DXSPRITE_OBJECTSPACE)というフラグを指定した所、確かに3Dの回転を実現できました。 しかし今度はテクスチャの画像が表示されなくなり、白いポリゴンが表示されるようになってしまいました。これを解決する方法をご存じの方、どうかご教示下さい。 あるいはD3DXSPRITE_OBJECTSPACEを使ったサンプルソースなどが掲載されたHPや書籍をご存じでしたら、紹介して頂きたく思います。

  • DirectX png画像でx軸回転について

    D3DXCreateTextureFromFile関数でpng画像を読み込んで、LPD3DXSPRITEのスプライト機能で描画しています。 float rad += 0.005f;という感じでラジアン値を変えつつ回転の様子を調べているのですが、どうも予想通りに動いてくれません。 D3DXMatrixRotationZでz軸回転させると、一定間隔でくるくる回ってくれて、これは予想通りです。 しかしD3DXMatrixRotationXでx軸回転させようとすると、一瞬で画像が縮んでしばらく消えてから、また一瞬の内に伸びて縮んでしばらく消える、という事の繰り返しになります。 なぜx軸(y軸もですけど)の時だと、上手く回転してくれないのでしょう? そして、どのように値を与えれば、一定間隔でくるくる回ってくれるようになるのでしょうか? どうかよろしくお願いします。

  • DirectXにおける2Dと3Dの座標の違い

    DirectXを使ったプログラミングの初心者で、Softbank Creativeの「シューティングゲームプログラミング」を使って勉強しています。 ライブラリの内容も関わってくるので少し分かりづらい質問ですが、2Dと3Dとで座標の指定の仕方が違うのがよく分かりません。 3Dでは、 D3DXMATRIX mat_view; D3DXVECTOR3 vec_from=D3DXVECTOR3(0, 100, 0); D3DXVECTOR3 vec_lookat=D3DXVECTOR3(0, 0, 0); D3DXVECTOR3 vec_up=D3DXVECTOR3(0, 0, 1); D3DXMatrixLookAtLH(&mat_view, &vec_from, &vec_lookat, &vec_up); device->SetTransform(D3DTS_VIEW, &mat_view); D3DXMatrixOrthoLH(&mat_proj, 120, 90, 1, 1000); device->SetTransform(D3DTS_PROJECTION, &mat_proj); Graphics->SetLight(0, D3DLIGHT_DIRECTIONAL, -1.0f, -1.0f, -1.0f, 1000); このあたりでカメラを設定し、画面端のx座標が±0.6になる……といったことを決めていましたが、 2Dでは VERTEX vertex[4]={ {x, y, z, 1, diffuse, u, v}, {x, y+dy, z, 1, diffuse, u, v+dv}, {x+dx, y, z, 1, diffuse, u+du, v}, {x+dx, y+dy, z, 1, diffuse, u+du, v+dv} }; device->SetFVF(D3DFVF_VERTEX); device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vertex, sizeof(VERTEX)); 例えば四角形ポリゴンを描くときにこんな風に記述して、 このx,yにはウィンドウの座標が入っています。 SETFVFでD3DFVF_XYZRHWを設定することで直接2Dに持ってこれる、というようなことが調べて分かったのですが、 三角形ポリゴンにテクスチャを貼り付けて2Dのような表現をする場合、必ずこのようにウィンドウに合わせた座標になる(する?)のでしょうか? つまり、3Dの時のように左端がx=-0.6……というような座標系で表現できないのでしょうか? 書籍には3Dから2Dに変換する式などがありましたが、このような変換をいちいち行わなくても最初から3Dの座標に2Dのものを表示できないのでしょうか? なにぶん初心者で見当外れのことを言っているかも知れませんが、ご教授をお願いいたします。

  • DirectX テクスチャの拡大

    こんばんは。最近DirectXを始めたばかりの初心者です。 開発環境はWindows XP + Visual Studio 2005です。 テクスチャを読み込んでスプライトで表示しているのですが、 拡大・縮小をする場合に指定した位置に行かずずれて表示されてしまいます。 色々なサンプルを見てもよくわかりません。 方法をご回答頂けると嬉しいです。

専門家に質問してみよう