- ベストアンサー
DirectXの2Dポリゴン描画について
- XP SP2 VC++ 6.0で、DirectX 9.0を勉強しています。2Dポリゴンの頂点フォーマットについて質問があります。
- TLVERTEXという構造体があり、その後にFVF_TLVERTEXというマクロが定義されていますが、その意味がわかりません。
- SetFVF関数の引数としてFVF_TLVERTEXを使うことになっていますが、その使い方も理解できません。誰か教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>これらの合計は2進数 自分の回答につっこみですが、すいません合計ではなくビット論理和です。(合計とは違います) ちなみに「|」と「&」、「^」はビット(論理)演算子と呼ばれるもので もし理解していないのであれば、ネット等で調べて勉強してください。 ※「||」や「&&」とは違う演算子です。 >SetFVF特有の書き方なのでしょうか? SetFVF特有ではありません。 DirectX以外にも例えばWindowsAPIでもよく使われる書き方です。 WinAPIのCreateFileの場合(http://msdn.microsoft.com/ja-jp/library/cc429198.aspx) dwAccessに指定する 0x40000000 (GENERIC_WRITE) と0x80000000 (GENERIC_READ) も2進数で表すとbitが被らないようになっていますよね? 例えば下記のようにしてビットを判定する事ができます。 void func(unsigned int dwAccess) { if (dwAccess & GENERIC_WRITE) { //GENERIC_WRITEフラグがたっている } if (dwAccess & GENERIC_READ) { //GENERIC_READフラグがたっている } } もし func( GENERIC_READ | GENERIC_WRITE );と指定すれば両方のif文を通ります。 以下のように定義しておくとお互いのビットに干渉しないように定義できます。(この場合、intが32bitなら32通り) #define FLAG_A 0x1 #define FLAG_B 0x2 #define FLAG_C 0x4 #define FLAG_D 0x8 #define FLAG_E 0x10 #define FLAG_F 0x20 #define FLAG_G 0x40 #define FLAG_H 0x80 #define FLAG_I 0x100 #define FLAG_J 0x200 #define FLAG_K 0x400 #define FLAG_L 0x800 ・ ・ ・ あとdefineって定数指定だけではありません。 例えば #include <stdio.h> #define MAX(A,B) ( A > B ? A : B) int main() { int max = MAX(10,20); printf("%d\n",max); return 0; } のような記述も可能です。
その他の回答 (2)
- sha-girl
- ベストアンサー率52% (430/816)
まずdefineの説明をすると 単純に置き換わるだけです。 つまりSetFVF(FVF_TLVERTEX);は SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1); とまったく同じ意味になります。 ちなみにそれぞれd3d9types.hで以下のように定義されています。 #define D3DFVF_XYZRHW 0x004 (2進数で100) #define D3DFVF_DIFFUSE 0x040 (2進数で1000000) #define D3DFVF_TEX1 0x100 (2進数で100000000) これらの合計は2進数であらわすと101000100で各ビットが被らないようになっており 各ビットがそれぞれに意味を持ちます。その意味については後で説明します。 ※defineの使い方はDirectX以前にC言語の基礎なので、 これがわかっていないのであれば、先にきっちりCを勉強しておいた方が良いと思います。 次にFVFです。 FVFとはFlexible Vertex Format(柔軟な頂点フォーマット)の略です。 3Dの頂点を表すにはXとYとZ座標が必要な事はわかると思います。 しかし、それ以外にも頂点カラー、テクスチャの貼り付け方等 の情報が必要なときもありますし、不要な時もあります。 FVFは要、不要に応じて それらを使いわける事を可能にします。 各defineの説明をすると D3DFVF_XYZRHW・・・XYZ座標と同次座標系のベクトルを頂点情報に持ちます。 D3DFVF_TEX1・・・UV座標(テクスチャの貼り付け方)を頂点情報に持ちます。 D3DFVF_DIFFUSE・・・DIFFUSE色を頂点情報に持ちます。 しかしもし、 D3DFVF_TEX1もD3DFVF_DIFFUSEも不要であったとしましょう。(テクスチャもDIFFUSE色も使わない) なら下記のようにする事ができます。 struct TLVERTEX { float x,y,z; float rhw; }; #define FVF_TLVERTEX(D3DFVF_XYZRHW) 使わないのであればVRAMの節約にもなります。
補足
具体例まで出して頂き、有難う御座います。 既述した様に、#define と ”(” があった為、理解できませんでした。#defineについては了解致しました。 もう少し教えて下さい。 D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1 の、”|”なのですが、”|”は、SetFVF特有の書き方なのでしょうか? それとも、C言語で一般的に使われる書き方なのでしょうか? 回答頂いた内容で、FVF_TLVERTEXは3つの情報を持つ(D3DFVF_XYZRHW、D3DFVF_TEX1、D3DFVF_DIFFUSE)ことはわかったのですが、 関数の引数を”|”で表すというのがイメージ出来ないのです。 宜しくお願い致します。
- WizTaka
- ベストアンサー率53% (7/13)
define 文についてですが, #define A B と書いた場合,「A を B に読み替えてもいいよ」ということです. なので,FVF_TLVERTEX と書いても (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1) として解釈されます. 逆に言うと,直接 (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1) と書いても問題ないということです. #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1) の部分は,どのような頂点データ構造体が定義されたかを表しています. 今の場合,「頂点は XYZ 座標・RHW値(2D変換用パラメータ)・頂点の色・テクスチャマッピング用座標 で表現されますよ」と定義している訳です. また,この define 文は頂点データ構造体の内容と一致していなければなりません. SetFVF関数は,レンダリングパイプラインに頂点データの構成がどんなものかを伝えるためのものです. なので,上の FVF_TLVERTEX を引数としてセットします.
お礼
有難う御座います。 #define NUM 3 等は見たことがあったのですが、 ”(” カッコ と”|” が付いていたので、FVF_TLVERTEXは関数で、引数をORで取るのかなどと色々考えてしまいました。 有難う御座いました。
お礼
有難う御座いました。 具体的な事例を用いての説明、非常に分かりやすかったです。 ビット論理和で func( GENERIC_READ | GENERIC_WRITE ); という様な使い方が出来るとは知りませんでした。 また、提示頂いたvoid func(unsigned int dwAccess) の考え方は、色々なところで応用が効きそうです。 どうも有難う御座いました。