SetStreamSourceでのストリームのクリアについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
兵糧

SetStreamSourceでのストリームのクリアについて

#1

投稿記事 by 兵糧 » 9年前

DirectXについての質問です。
複数のストリームを使用して頂点バッファを各要素毎に分けて使用しているのですが、
使用しない要素をクリアするときは(例えば、0番だけ利用して1番2番をクリアするときは)

SetStreamSource(0,lpBuffer,0,sizeof(D3DXVECTOR3));
SetStreamSource(1,NULL,0,0);
SetStreamSource(2,NULL,0,0);


とするようにとネットで調べると書いてありました。
ところが、私の環境では上記の方法だと、DrawPrimitiveがアクセス違反を起こしてしまい、プログラムが中断されてしまいます。
どうやら、DrawPrimitiveがストリームのNULLにアクセスしてしまい、アクセス違反になっているようです。
そこで試しに、

SetStreamSource(0,lpBuffer,0,sizeof(D3DXVECTOR3));
SetStreamSource(1,lpBuffer,0,0);
SetStreamSource(2,lpBuffer,0,0);

のように、例えば、頂点バッファしかないモデルなのであれば、法線のストリームにもUVのストリームにも、同じ有効なバッファへのポインタを渡し、ストライドを0にするという形にしたところ、アクセス違反も起きず、ちゃんと描画もされました。
しかし、この方法って安全なんでしょうか?
ネットで書いてあるやり方と違うので何だか心配です。

それに、有効なストリームバッファを読み取り幅0で流すというのが実際にどう動作して影響するのかが分からず、気持ちが悪いです。
なにせ頂点宣言で宣言されたバッファサイズとは違う大きさで流しているので...。
上記のような有効なポインタに0ストライドという形のSetStreamSourceが安全なのか、またちゃんと要素のクリアが出来ているのか。
どなたか分かる方がいらっしゃいましたら宜しくお願いします。

匿名希望の774さん

Re: SetStreamSourceでのストリームのクリアについて

#2

投稿記事 by 匿名希望の774さん » 9年前

SetStreamSourceやDrawPrimitiveの返り値は調べましたか?

兵糧

Re: SetStreamSourceでのストリームのクリアについて

#3

投稿記事 by 兵糧 » 9年前

SetStreamSourceはNULLを渡しても有効なハンドルを渡してもどちらでもD3D_OKです。
DrawPrimitiveは関数自体(DrawPrimitive関数内部)がエラーで止まってしまうので、どうやって返値を調べればいいか分かりません。

兵糧

Re: SetStreamSourceでのストリームのクリアについて

#4

投稿記事 by 兵糧 » 9年前

あと、SetStreamSourceで有効なポインタ + ストライド0した後のDrawPrimitiveは問題なく描画されてD3D_OKが返ります。

アバター
Ciel
記事: 252
登録日時: 9年前

Re: SetStreamSourceでのストリームのクリアについて

#5

投稿記事 by Ciel » 9年前

各ストリームと、頂点デクラレーションの設定を見たいので、その部分のコードを貼っていただけますか?
oui C'est la Vie♪

兵糧

Re: SetStreamSourceでのストリームのクリアについて

#6

投稿記事 by 兵糧 » 9年前

返信有り難うございます。
そしてすいません、自己解決しました。

お察しの通り頂点宣言と実際に渡したバッファのサイズが違ってました。
お騒がせしてすみませんでした。;;;


閉鎖

“C言語何でも質問掲示板” へ戻る