2

私はDirectX(XNAを使用)をしばらく使用していて、最近OpenGLに切り替えました。私はそれを本当に愛していますが、1つのことが私を苛立たせました。

頂点シェーダーで動的インデックス付けを必要とするものを実装しようとしていますが、これにはSM4.0と同等のものが必要であると言われています。ただし、これはSM 2.0、場合によっては1.0でもDXで機能することを私は知っています。XNAのインスタンス化サンプルは、これを使用してSM2.0のみのカードhttp://create.msdn.com/en-US/education/catalog/sample/mesh_instancingでインスタンス化を行います。

コンパイラは、ifステートメントの巨大なリストにそれを「展開」することはできません。これは、250インスタンスのSM2の命令制限を確実に超えるためです。

それで、DXはOpenGLではできないトリックを実行していますか、OpenGLを操作して同じことを実行できますか、それともOpenGLが公開していないハードウェア機能ですか?

4

2 に答える 2

0

あなたのリンクから:

単一の完全なインスタンス化手法はないことに注意してください。これは、Xbox 360とは異なる方法でWindowsに実装する必要があり、 Windowsでは理想的な手法にはシェーダー3.0が必要ですが、シェーダー2.0で機能するフォールバックアプローチもあります。このサンプルは、いくつかの異なるインスタンス化手法を実装しているため、プラットフォームとシェーダーバージョンの両方で機能します。

大胆な部分ではありません。したがって、基本的に、シェーダーモデル3で同様のインスタンス化を実行できるはずです。シェーダーモデル2のインスタンス化は、通常、マトリックスパレットを使用して実行されます。つまり、一度に大量の変換行列をアップロードすることで、1回の呼び出しで複数のメッシュをレンダリングできるということです。これにより、描画呼び出しが減り、速度が向上します。

とにかく、OpenGLの場合、この拡張機能を完成させるのに多くの問題があったため、シェーダー4が必要です。ただし、頂点ごとのマトリックスパレットインデックスをyoru頂点構造に固定し、シェーダーを使用してマトリックスパレットレンダリングを実行できます...

于 2010-12-06T18:13:34.897 に答える
0

glUniform3fvのようなものを使用して、光の方向の配列をアップロードできます。次に、(正しく実行しようとしていることを理解していると仮定して)この配列にインデックスを含めるために頂点フォーマットが必要です(したがって、これらの重複がたくさんあります)インデックスがメッシュごとに1回だけ変更される場合など)。まだわからない場合は、glGetAttribLocation + glVertexAttribPointerを使用して、このような任意の頂点属性をシェーダーに送信できます(gl_Vertex、gl_Normalなどの非推奨の組み込み属性を使用するのではありません)。

于 2011-01-04T07:18:24.150 に答える