DIRECTXのスプライト描画でテクスチャサイズが制限される問題

このQ&Aのポイント
  • DIRECTX9.0、VC++6.0を使って、テクスチャサイズが256*256を超えると正常に表示できない問題が発生しています。縦横共に2の乗数のテクスチャでもうまく表示されないことが報告されています。
  • 大きな画像ファイルを表示するための解決策はありますか?DIRECTXでテクスチャサイズを制限せずに描画する方法についてご教示ください。
  • DIRECTXのスプライト描画でテクスチャサイズが256*256を超えると正常に表示できない問題があります。縦と横のピクセル数が2の乗数以外の中途半端なサイズのテクスチャは、キリの良いサイズに変換されるようですが、それでもうまく表示されません。どのようにすればテクスチャサイズの制限なしで大きな画像ファイルを表示することができるのでしょうか?
回答を見る
  • ベストアンサー

DIRECTXのスプライト描画で質問です

いつもお世話になってます。 DIRECTX9.0、VC++6.0を使っています。 DIRECTXでLPDIRECT3DTEXTURE9(テクスチャ)とLPD3DXSPRITE(スプライト)を使って描画しています。 ですが、テクスチャの縦と横のサイズが256*256を超えたものが正常に表示できません。 色々調べてみると、縦と横のピクセル数が2の乗数以外の中途半端なサイズのテクスチャは、キリの良いサイズに変換されるみたいですが、一応縦横共に2の乗数のテクスチャなのにうまく表示できません。 例:768*512ピクセルのTGA形式のファイル 大きな画像ファイルを表示する方法はないでしょうか? どうぞ宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

古いグラフィックカードだと最大テクスチャサイズが256*256なんてのもあります。 IDirect3D9::GetDeviceCapsで取得できるD3DCAPS9構造体の中に 最大テクスチャサイズが入っています。 またVRAMは足りているでしょうか? CreateTexture等が成功しているかどうかもチェックしてみてください。 512*512でアルファ付きのフルカラーだと それだけで1MほどのVRAMを消費します。

amoban
質問者

お礼

お答え有難うございます。 やはりテクスチャを沢山使用していたため、VRAMが不足していたようです。 不必要なテクスチャもいっぱい登録していたので、それらを削ったら表示できました。 どうも有難うございました。

関連するQ&A

  • DirectXのSpriteについて

    現在DirectXを使ってプログラムを書いています。 スプライトを使って画像を描画しようと思ったのですが、 LPD3DXSPRITE pSprite;//スプライト LPDIRECT3DTEXTURE9 texture;//適当な画像 pSprite->Begin( 0 ); pSprite->Draw( texture, 0,0,0,0xffffffff ); pSprite->End(); というように使って画像を描画するようですが、これを見ると pSpriteはアプリケーション内に1つ存在すればいいような気がするのですが複数用意する意味はあるのでしょうか? 教えてください。

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

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

  • [DirectX9.0]テクスチャのサイズについて

    Visual C++ 6.0でDirectX9.0を使用しています。 画像ファイルからテクスチャを作り、それを画面に表示します。 その時に、画像ファイルのサイズが縦横どちらとも2の階乗の数字でないと、勝手に拡大表示されたりしてうまく表示されません。 数字が2の階乗でないサイズの画像ファイルを、テクスチャを使用してそのままの大きさで貼り付けるのにはどうすれば良いのでしょうか? よろしくお願いします。

  • 描画について

    今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); }どうしたらきちんとした位置に描画できるのでしょうか。

  • DirextX9.0を使用した2Dゲームにおけるデータ設計

    【環境】WinXP/VC++6.0/DirectX9.0 お世話になっております。 上記環境で2Dゲームの作成を考えた場合、プレイヤー・敵などのキャラクタークラスと、それらを描画するためのスプライトクラスをどのように関連付けるかについて決めかねています。 なお、DirextXの2D機能のみ使用する前提です。 1.スプライトにキャラクターのポインタを持たせる。 2.キャラクターにスプライトのポインタを持たせる。 3.キャラクタークラスをスプライトクラスから派生する。 私は以下のように 1.の案を検討しているのですが、改善点や一般的な設計方法がありましたらご指摘いただけると幸いです。 // プレイヤー、敵など画像と座標をもつオブジェクトの基本クラス class CBaseUnit {  位置座標、移動方向、移動速度、ステータス、 等 }; // プレイヤークラス class CPlayer : public CBaseUnit {  プレイヤーに固有の属性、操作 }; // スプライトクラス class CSprite {  テクスチャー、  描画順序、 等  CBaseUnit** ppUnit; //(★) public:  BOOL Update(){   // (*ppUnit) が NULL なら FALSE を返す。  };  BOOL Draw(ID3DXSPRITE lpD3DXSprite){   // (*ppUnit) から座標を取得して lpD3DXSprite->Draw(座標等);  }; }; // スプライト管理クラス CSpriteManager {  ID3DXSPRITE lpD3DXSprite;  CSpriteのリスト list; public:  VOID Update(){   // list 内の各スプライトに対し以下の処理   if (!スプライト->Update()) {    // スプライト に関連付いた CBaseUnit オブジェクトが消滅したことを    // 意味するので、このスプライトをリストから除外する。   };  };  Draw(){   // リスト内の全スプライトに対し以下を実行   スプライト->Draw(lpD3DXSprite);  }; };

  • DirectX テクスチャの拡大

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

  • DirectX:描画されません・・・ヒント下さい・・・

    VCでC++を使ってDirectXを使ったプログラムを書いてます。 そういう仕事しているわけではなく、素人です。 DirectXは色々とややこしくて、何がなんだかさっぱりです。 とりあえず、Win32APIを使って、ウィンドウを表示し、DirectXを使って、ボタンを押すことで、ウィンドウモードとフルスクリーンモードを切り替えることの出来るプログラムは作れました。 しかし、3Dのモデルが表示されません。 何が駄目なのかが、さっぱりです。 こういう場合、何に原因があることが多いのでしょうか?? DirectX経験者の方、どうか、教えてください。お願いします。 以下に現在の状況を列挙します。 足りなければ、ご指摘ください。 ソースは見せることはできるのですが、かなり、スパゲティーなので・・・・。 DirectX:November 2008 目標:Xファイルからじゃなく座標を自分で指定して立方体を描画したい 出来ていると思われること ・Win32APIを使ったウィンドウの作成 ・Direct3Dオブジェクトの作成Direct3DCreate9⇒  D3DDeviceオブジェクトのプレゼンテーションパラメータの設定 ・カメラとライトの設定 ・あと、DirectXのメソッドで背景色だけは変えられます。 経験者の方がた、よろしくお願いします!!

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

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

  • Wave波形の描画について

    現在C,C++を用いてwave波形の描画が出来るソフトを作成してみようと思っています。 最終的には一般的な波形データ編集ソフトと同じようなものを目指しているのですが、以下の点にてどのように実装するといいのか悩んでいます。 1、波形データを描画する 2、表示した波形データを伸縮できるようにする(縦横) 3、waveデータを再生した際に、再生位置にあわせて波形データをスクロールさせる 現在waveデータからサンプルデータ値を抽出するところまでは出来ています。 単純に1つ1つのサンプルどうしを線で結ぶという処理を大量に繰り返すという方法だととても重たくなるため別の方法を探していたところ、DirectXを使ってロードの際に波形データをテクスチャに一気に描画しておいてあとはそれを表示/加工する、といった処理が出来るのかなと思っているのですが具体的な方法がわからずに困っています。 上記実装についてご助言いただけないでしょうか。上記以外の方法でも結構でございます。 DirectXについても初心者ですのでお勧めの書籍やWebサイトなど併せて紹介していただけると非常に幸いでございます。 どうぞ宜しくお願い致します。

  • iPhoneSDK 楕円の描画およびグラデーション

    iPhoneSDK環境で図形の描画を行うプログラムで行き詰まっています。画面に楕円を描画をしたいのですがどのように処理をしたら良いのかわかりません。行いたい処理は縦もしくは横に長い楕円でその楕円を指定した角度の傾いた描画を行いたいのです。表示したい座標、縦横の半径、角度などの指定して一発で描画できる機能など無いのでしょうか? それと添付した画像のように描画して楕円の中に指定した色でグラデーションをかける事ができるでしょうか?一度に沢山の質問ですが分かる方がいましたらお手数ですが宜しくお願い致します。

専門家に質問してみよう