ページ 11

DrawIndexedPrimitiveによる描画

Posted: 2014年11月17日(月) 04:05
by MoNoQLoREATOR
DirectX9のお話です。
DrawIndexedPrimitiveを用いて描画を試みています。
しかし、期待通りの表示になりません。
real.png
real.png (33.5 KiB) 閲覧数: 3780 回
このような表示になってしまいます。

何が悪かったのでしょうか?

とりあえず、問題があると思われるソースコードを掲載します。
下の方に記述されているload関数とdraw関数をまずご覧ください。
あとはその関数内で呼ばれている関数等を追ってゆけばソースコードを解析できると思います。
► スポイラーを表示
トライアングルストリップで描画を行います。

頂点情報の格納順は次図の通りです。
top.png
top.png (6.18 KiB) 閲覧数: 3780 回
頂点インデックス情報の格納順は次図の通りです。
index.png
index.png (9.08 KiB) 閲覧数: 3780 回
デバッグモードで一行ずつ追ってみたところ、期待通りに値が格納されてはいるようです。
しかし、実際には設定したはずの頂点とはかけ離れた頂点が結ばれていくという結果になります。

ちなみにワールドマトリックスを単位行列にして実行したところ同じような結果になったため、ワールドマトリックスの指定が原因ではないようです。

何が間違っているのでしょうか?
よろしくお願いします。

Re: DrawIndexedPrimitiveによる描画

Posted: 2014年11月17日(月) 21:22
by ARCS
CreateIndexBufferでD3DFMT_INDEX16(16bit)を指定しているのに、インデックスバッファにDWORD(32bit)でアクセスしています。

Re: DrawIndexedPrimitiveによる描画

Posted: 2014年11月18日(火) 05:34
by へにっくす
原因はARCSさんの言う通りだと思いますので
私はちょっと気になることを。
一応念のため。

インデックスの格納順に面をとると、
以下のように10面になりますが。
a)3,0,4
b)0,4,1
c)4,1,5
d)1,5,2
e)5,2,6 →右の赤部分
f)2,6,3 →右の青部分
g)6,3,7
h)3,7,4
i)7,4,8
j)4,8,5
dixq_net_forum_3_t15989_image_1.png
三角形は10面になると思うのですが
dixq_net_forum_3_t15989_image_1.png (9.47 KiB) 閲覧数: 3623 回
意図したとおりでしょうか?
e)とf)は余計な三角形になると思うのですが…
(確かめたわけではないので間違ってたらすみません・・・)

Re: DrawIndexedPrimitiveによる描画

Posted: 2014年11月19日(水) 11:18
by MoNoQLoREATOR
返信ありがとうございます。

ARCSさんの仰る通り、CreateIndexBufferの引数に指定した設定と、実際に使用しているデータの形式が食い違っていることが原因でした。
インデックスバッファにDWORDではなくWORDを用いるようにしたところ、ギザギザな表示ではなくなりました。

へにっくす さんが書きました:原因はARCSさんの言う通りだと思いますので
私はちょっと気になることを。
一応念のため。

インデックスの格納順に面をとると、
以下のように10面になりますが。
a)3,0,4
b)0,4,1
c)4,1,5
d)1,5,2
e)5,2,6 →右の赤部分
f)2,6,3 →右の青部分
g)6,3,7
h)3,7,4
i)7,4,8
j)4,8,5
dixq_net_forum_3_t15989_image_1.png
意図したとおりでしょうか?
e)とf)は余計な三角形になると思うのですが…
(確かめたわけではないので間違ってたらすみません・・・)

私の図ではわかりにくいですが、よくみると2番と6番の位置で1度ずつ足踏みしています。
インデックスの格納順に面をとると、
以下のように12面になります。
a)3,0,4
b)0,4,1
c)4,1,5
d)1,5,2
e)5,2,2
f)2,2,6
g)2,6,6
h)6,6,3
i)6,3,7
j)3,7,4
k)7,4,8
l)4,8,5
よって問題ありません。



さて、ギザギザに表示される問題は解決されましたが、期待通りの表示にはなりませんでした。
真っ黒に表示されてしまいます。
法線ベクトルを逆向きに設定すると期待通りに表示されました。
が、理論上おかしいような…。
おそらくプリミティブ描画とは関係なく、これはライティングに問題がありそうです。
正直どうしたら良いのかさっぱりわかりませんが、とにかくやれるだけのことはやってみます。
それでもどうにもできなかった場合はまた質問させて頂きますのでよろしくお願いします。

ありがとうございました。