ページ 11

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

Posted: 2010年12月25日(土) 21:44
by 兵糧
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が安全なのか、またちゃんと要素のクリアが出来ているのか。
どなたか分かる方がいらっしゃいましたら宜しくお願いします。

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

Posted: 2010年12月26日(日) 01:13
by 匿名希望の774さん
SetStreamSourceやDrawPrimitiveの返り値は調べましたか?

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

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

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

Posted: 2010年12月26日(日) 13:40
by 兵糧
あと、SetStreamSourceで有効なポインタ + ストライド0した後のDrawPrimitiveは問題なく描画されてD3D_OKが返ります。

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

Posted: 2010年12月26日(日) 14:23
by Ciel
各ストリームと、頂点デクラレーションの設定を見たいので、その部分のコードを貼っていただけますか?

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

Posted: 2010年12月27日(月) 14:32
by 兵糧
返信有り難うございます。
そしてすいません、自己解決しました。

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

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

Posted: 2010年12月27日(月) 14:33
by 兵糧
解決しました