スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DirectXの描画方法を更に変えてみる

【リンク】 ◆解説系TOP◆

先日、 DrawPrimitiveUP関数だけでなく、
他の異なる描画方法として、
-------------------------------------
DrawPrimitive関数
DrawIndexedPrimitive関数
DrawIndexedPrimitiveUP関数
-------------------------------------
なども試したのですが、 更に描画方法を変えてみます。


まず、レンダリングパイプラインにデータを流す道のようなもの(データストリーム)
があり、それは最大16本あるのですが、

【参考画像】
レンダリングパイプライン

今まで、1本しか使っておりませんでした。


↓今までの大まかな流れ。
MY_VERTEX* v;
g_pD3DDevice->CreateVertexBuffer(//省略);
g_vb->Lock( 0, 0, (void**)&v, 0);
//頂点データを入れる
g_vb->Unlock();

g_pD3DDevice->SetStreamSource( 0, g_vb, 0, sizeof(MY_VERTEX) ); //データストリーム0番を指定。それだけ。
g_pD3DDevice->SetFVF(MY_VERTEX_FVF);
g_pD3DDevice->Primitive(//省略);


なので今回は、複数のデータストリームを使って描画しようと思います。
※具体的に言うと、頂点、法線、頂点色などの
データの種類ごとにデータストリームを分割します。

【参考画像】
パイプライン


で、こういう風にすると良い事があります。

まず、今までの構造体のデータをデータストリーム0番に流すという方式だと、
構造体の定義が面倒な事になります。
(データの組み合わせが無数に存在するため)


【組み合わせの例】
------------------------------------------------------------------------
パターン1:頂点座標スペキュラー色
パターン2:頂点座標法線頂点サイズ
パターン3:頂点座標法線頂点色
パターン4:頂点座標法線テクスチャ座標
パターン5:頂点座標法線頂点色テクスチャ座標
パターン6:頂点座標頂点色
パターン7:頂点座標頂点サイズ頂点色

------------------------------------------------------------------------
【構造体の定義例】
struct MY_VERTEX{
float px, py, pz;
float nx, ny, nz;
};
struct MY_VERTEX2{
float px, py, pz;
DWORD color;
};
struct MY_VERTEX3{
float px, py, pz;
DWORD color;
float u,v;
};
struct MY_VERTEX4{
float px, py, pz;
float nx, ny, nz;
DWORD color;
float u,v;
};
:
以下略
このように、可能性のある組み合わせの構造体を定義しておかなければなりません。


それと定義以外にも、自力でXファイルを読み込むクラスを作る場合、
データを最後まで読み込まないと、どの構造体を適用すればよいのか分かりません。
(上記で言えば、パターン何番なのかが分からない)

これも処理が面倒になります。

しかし、それぞれのデータをバラバラに定義しておけば、
構造体の数が増えまくることはありません。

struct VERTEX_POSITON{
float px, py, pz;
};
struct VERTEX_NORMAL{
float px, py, pz;
};
struct VERTEX_DIFFUSE{
DWORD color;
};
struct VERTEX_UV{
float u,v;
};

上の構造体を定義しておけば、 下記の組み合わせ全てに対応できます。
--------------------------------------------------------------
頂点座標頂点色
頂点座標頂点色テクスチャ座標1
頂点座標頂点色テクスチャ座標1テクスチャ座標2
頂点座標法線頂点色
頂点座標法線頂点色テクスチャ座標
頂点座標法線頂点色テクスチャ座標テクスチャ座標2

--------------------------------------------------------------
(バラバラの部品を用意しておいて、必要に応じて組み合わせる感じ。)


また、Xファイルの読み込みも
-------------------------------------------------------
頂点座標の情報が来たら、頂点座標のバッファ確保
法線の情報が来たら、法線のバッファ確保

-------------------------------------------------------
という風に、適宜 個別のバッファを確保して行けばいいだけになります。

※構造体形式だと、下記の様な手順になってしまいます。
----------------------------------------------------------------------
【1】全てのデータを一時的に保持しておく (頂点座標、法線、頂点色など全て)
【2】データを読み終わった後、どの組み合わせの構造体なのかを把握
【3】任意の頂点データの組み合わせの構造体のバッファを作成。
【4】構造体のバッファに、一時保存しておいたデータを代入していく。

----------------------------------------------------------------------


あと、データストリームを分割する事のメリットはもう1つあります。
分割しない場合は、データを流す、流さない、
つまり描画するか、しないかの2択しかない訳ですが、

【参考画像】
ストリーム

分割しておくと、一部のデータだけ流す、という事が出来るようになります。

【参考画像】
ストリーム2

モデリングソフトなんかでは、 頂点だけを表示面も表示線だけを表示など
切り替えられる機能があったりしますよね。
まさに あんな感じです。

で、概念だけでなく、実際のプログラムも書いてみようと思います。

【ソースコード】MultiStream.txt

※とりあえずソースコードをUPしました。
→と←で、表示が切り替わります。(頂点の 表示←→非表示)

解説は後日になります ε(´・ω・`)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。