1

Direct3d9 のフレームごとに頂点バッファーをロックして、blendshape コードからのデータを入力します。私のシェーディングは 2 つのステップを使用するため、1 つのシェーダーで 1 回レンダリングしてから、もう 1 つのシェーダーで加算ブレンドを描画します。

私以外の理由で、頂点バッファーのデータは、これら 2 つの描画呼び出しの間で (明らかに) わずかに異なります。

これはすべて 1 つのスレッドで行われ、バッファは render が呼び出されるかなり前にロック解除されます。さらに、シェーダー命令への変更は発生しないため、データは両方の呼び出しでまったく同じである必要があります。ブレンドシェイプが変更されない場合、Z ファイティングは発生しません。

今のところ、シェーダーの深度を少し「プッシュ」していますが、これは非常に洗練されていない解決策です。

このデータが変更される理由 バッファーのロックを解除した後、DirectX がバッファー内のデータを変更するのはなぜですか? 変更しないように強制できますか?

4

2 に答える 2

1

1位。データは本当に D3D によって変更されているのでしょうか、それとも単なる仮定ですか? D3D はあなたのデータを変更しないと確信しています

2番目。あなたが言ったように、ジオメトリを描画する 2 つの異なるシェーダーがあります。それらは異なる変換操作を持つ場合があります。または、最適化のためにシェーダーの変換が異なる可能性があります。そのため、変換された頂点がわずかに異なる場合があります (ただし、Z ファイティングには十分です)。1 つのシェーダー/テクニックで 2 つのパスを使用することをお勧めします。または、それでも 2 つのシェーダーを使用したい場合は、変換およびその他の同一の操作に共有コードを使用することをお勧めします。

于 2012-11-05T16:19:00.197 に答える
0

D3D ランタイムが、頂点バッファーによって渡されたデータを変更しないことは確かです。Z ファイティングなしで、2 つのレイヤーの地形をレンダリングするときと同じことを行いました。ただし、実際には、三角形をピクセルにラスタライズするときに変更されるレンダリング ステートがいくつかあります。これらは、D3D9 の D3DRS_DEPTHBIAS と D3DRS_SLOPESCALEDEPTHBIAS、または D3D10_RASTERIZER_DESC 構造体の等しい値です。これらのレンダリング ステートが変更された場合は、それらを確認する必要があります。

また、シェーダー内の位置で計算を行うすべての変換行列またはその他の定数が正確に等しいことを確認する必要があります。そうしないと、Z ファイティングが発生します。

グラフィックデバッグツールを使用して確認することをお勧めします。NVIDIA カードを使用していた場合は、PIX、PerfHUD、または Nsight を使用できます。

私の下手な英語で申し訳ありませんが、理解するのは難しいに違いありません。しかし、これがあなたを助けてくれることを願っています、ありがとう。

于 2012-11-15T03:55:26.440 に答える