DirectXのSpriteの描画について

このQ&Aのポイント
  • VisualStudioでC++とDirectXを使用して3DオブジェクトとSpriteの描画を行う方法について教えてください。
  • 画面の左上を座標(0,0)としてSpriteのテクスチャを描画したいのですが、具体的な実装方法を教えてください。
  • 現在、3Dオブジェクトは描画されていますが、Spriteが正常に描画されません。どのように修正すればよいでしょうか。
回答を見る
  • ベストアンサー

directxのspriteの描画について

VisualStudioによりc++とdirectxを使って3Dオブジェクト(xファイルなど)とspriteによるテクスチャの描画をしたいのです。3Dの格闘ゲームのようにカメラが動いているのに、ライフバーが固定されているようなものを作りたいのです。 3Dオブジェクトはプロジェクション変換とビューポート変換をして描画し、spriteのテクスチャは画面の左上を座標(0,0)として描画したいのですが、どのように実装すればいいのでしょうか? 現時点ではspriteを描画する前にプロジェクション変換とビューポート変換のときに使うポインタを初期化してパイプラインに送ればいいと考えやったのですが、3Dオブジェクトは描画されているのですがspriteはうまくいきませんでした。

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

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

>ビルボードを考えたのですが、 > 画面を縦640横480で開発していて、 > 左上を原点としてスプライトを > 描画できたら座標が確認しやすいと思いました。 ビルボードと書きましたが、正確にはポリゴンの座標変換済み頂点を 使用してテクスチャのUV座標を使用すれば、座標変換の処理を 飛ばすことができるので、通常の座標の感覚で使用することが できると思います。 あとは3Dを描画した後に、 lpD3DDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0 ); などをして深度バッファをクリアした後、 2Dを描画すれば3Dオブジェクトの上に2Dの絵が表示されると思います 具体的なコードは少しここでは難しいかもしれませんが。。。

meziti
質問者

お礼

回答ありがとうございます。 座標変換済み頂点というキーワードを調べて実装することができました。座標変換済み頂点を使えばスプライトを使わなくてもよくなり、また3Dのときと使い方が似ているのでこの先使いやすそうです。とても勉強になりました。

その他の回答 (1)

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

単純にZバッファやレンダリングステートの設定の問題な気も しますがどうしても3Dとして処理したいならビルボードとかにして、 透明なテクスチャを一番手前に張ってその上に描画すれば、 同じような効果が得られるのでは?

meziti
質問者

お礼

回答ありがとうございます。 ビルボードを考えたのですが、画面を縦640横480で開発していて、左上を原点としてスプライトを描画できたら座標が確認しやすいと思いました。 スプライトだけを描画するときは座標の原点が左上になりますが、3Dオブジェクトでプロジェクション変換とビューポート変換をしますとそれが崩れてしまいます。やはり共存は無理なのでしょうか?

関連するQ&A

  • Directxで一度に描画する方法

    DirectXで複数枚のポリゴンを描画しているのですが、それぞれ頂点変換行列やテクスチャが違うのでDrawPrimitiveをポリゴン毎に呼び出さなければいけなくなっています。 上記のような状態で一度に描画する方法はありますでしょうか?

  • DirectXによる「黒い物体」の描画

    現在、DirectXを用いて原潜のメッシュを描画しています。 今はテクスチャを貼っていますが、パフォーマンス改善のためテクスチャを貼らないものも制作しようと思いました。 しかし、黒い物体をそのまま描画すると、当然黒くて形状がわからないものが描画されてしまいます。 そこで質問なのですが、黒い物体を、光沢を付けるなどして形状が明確にわかるように描画するにはどうすればいいでしょうか? 3Dモデル制作の段階や、マテリアルの設定、ライトの設定などの範囲で回答していただけたらなおありがたいです。 なお、自己照明は最大にしており、黒い物体以外は正常に描画されるため、黒い物体だけの問題だと思われます。 回答よろしくお願いします。

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

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

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

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

  • リアルタイムで多数の3角形ポリゴン(2D)を描画したい

    リアルタイムでテクスチャを貼った多数の3角形ポリゴン(2D)をアルファブレンドを加味して描画したいのですが、OpenGL,DirectX等は使わずに自前のコードで実装したいのです。参考になるアルゴリズムを紹介したサイト、ソースコードなどを掲載しているサイトなどありましたら教えてください。検索のヒントになるワードでも結構です。お願いします。

  • OpenGLのD3DTS_WORLDはどれですか?

    こんにちは。 OpenGLでプログラムを書いているものです。 もともとはずっとDirectXでプログラムを書いていたものですが、行列の扱い方で質問させてください。 DirectXでは変換行列はD3DTS_PROJECTION,D3DTS_VIEW,D3DTS_WORLDと3つあったと思うのですが(他にもテクスチャ変換行列などがありますが今回は除外)OpenGLでD3DTS_WORLDに当たるのはどれでしょうか? 現在私は以下のように考えています。 // 射影行列 glMatrixMode( GL_PROJECTION ); glLoadMatrixf( proj ); // ビューイング行列 glMatrixMode( GL_MODELVIEW ); glLoadMatrixf( view ); モデルの頂点を変換するワールド行列はどこにセットすればよいでしょうか? よろしくお願いします。

  • 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のものを表示できないのでしょうか? なにぶん初心者で見当外れのことを言っているかも知れませんが、ご教授をお願いいたします。

  • ゲーム製作で質問です;;

    DirectX9.0bのバージョンでゲームを作っています。 3Dの主観視点ゲームにしたいと思っているのですが、 例えばポーズ画面や、メニュー画面、またHPの表示等で、プレイヤーがどこを向いていてもスクリーン座標で見て、一定の場所に2D・3Dのオブジェクトを描画する場合にはどんな実現方法があるか教えてください^^; L・Rボタンで前面に出ている2Dオブジェクトを切り替えたりできたらなぁ・・・と思っています FVFで座標変換済み頂点は、行列が掛けられないので移動等には向かなさそうですが・・・

  • Wave波形の描画について

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

  • 陰影結果を頂点カラーとして焼き付けたい

    3DCG系ソフト初心者です。 3Dオブジェクトのリングがあるのですが、照明効果でついた陰影を頂点カラーとして焼き付けたいです。 現状使用しているソフトはBlenderですが3dsmaxも体験版ならインストールしています。 焼き付けを行ったらMetasequoiaでテクスチャを使わず陰影結果ごと読み込ませたいです。 用途は.mqoファイル形式をOpenGLで描画できる情報に変換し、OpenGLで描画することです。 当然1シーンのライティング結果を焼き付けてしまうので回転などさせれば不自然なものにはなりますが、描画負荷の軽減のための措置です。 テクスチャベイクのやり方もまだままなりませんが、今回はテクスチャではなく頂点カラーとして焼き付けたいです(3Dオブジェクトはかなり細かい座標で作成されているため)。 BlenderやMetasequoiaだと本当は良いのですが、他のソフトでもお勧めのやり方がありましたらお教え下さい。 よろしくお願いいたします。