0

2つの四角形(8つの頂点、インデックス付きの三角形を使用)で構成される長方形があります。

------+------
| \   | \   |
|  \  |  \  |
|   \ |   \ |
______+______

また、2つのテクスチャがあります。両方をシェーダーにバインドします。

長方形の一部(左のクワッド)を最初のテクスチャでテクスチャリングし、他の部分を2番目のテクスチャでテクスチャリングしたいと思います。

しかし、ピクセルシェーダーの頂点の位置に基づいてテクスチャを選択すると、「+」でマークされた頂点に問題が発生します。あるとき、最初のクワッドの「+」頂点を分析していますが、同じ位置にある頂点も2番目のクワッドにあります(2番目のテクスチャが必要です)。そのため、位置でテクスチャを設定するとエラーが発生します。

(サンプラーで)割り当てるテクスチャを決定する方法は?2回目のパスを作成したり、シェーダーに追加情報を追加したりしたくありません(それなしで実行するオプションがある場合)。

基本的に言えば、私にはモデルとそのエッジがあります。そのエッジは、テクスチャがどこで変化するかを示します。しかし、その目標を達成する方法は?そのエッジの頂点にtexture1またはtexture2を設定すると、いくつかのエラーが発生します。

4

1 に答える 1

1

あなたのアプローチは間違っていると思います。シェーダーの条件付き分岐はシェーダーの速度を低下させるため、可能な場合は回避する必要があります。その理由は、シェーダーが各ピクセルに対して同じコードを並行して実行するように最適化されているためです。grphicsカードの実装に応じてシェーダーに条件を設定すると、次のいずれかが発生します。シェーダーが条件の両方のブランチを実行し、実行後に各ピクセルに適切なパスを選択するか、すべてのピクセルを最長のパスまで待機させます。条件の実行が終了してから続行します。

あなたの場合、2つのテクスチャで1つのプリミティブを描画しようとしています。このように定義した場合、これは実際には不可能です。コンセプトを変更すると、必要な効果を簡単に実現できます。

私は2つの可能なアプローチを考えることができます(もっとあるかもしれません):

  1. 最初で最も簡単なのは、それぞれ独自のテクスチャを使用して2つのクワッドを描画することです。シェーダーを2回呼び出すのは事実ですが、とにかく正確なピクセル数が描画されるため、実際の速度低下はほとんど見られません。
  2. 2番目のアプローチはやや複雑ですが、1回だけ描​​画できます。あなたがする必要があるのは、2つのテクスチャを並べて含む1つの大きなテクスチャを作成し、テクスチャ全体を三角ストリップ全体にマッピングすることです。このようにして、レンダラーは各クワッドが独自のテクスチャを取得することを確認します。OpenGlでは、これはを使用して行われglTexSubimage2Dます。direct3d 9では、より複雑で、次のシーケンスを使用します。A.Bを使用し
    てテクスチャを作成します。CCreateTexture
    を使用してレベル0のサーフェスを取得します。DIDirect3DTexture9::GetSurfaceLevel()
    を使用して画像をサーフェスにロードします。サーフェスを解放します。D3DXLoadSurfaceFromMemory()

したがって、0から0.5までの水平テクスチャ座標を最初のクワッドの頂点にマッピングし、0.5から1までの座標を2番目のクワッドの頂点にマッピングします。クワッドが同じサイズでない場合、またはテクスチャが同じサイズでない場合は、それに応じてマッピングを変更するだけです。

シェーダーで条件ブランチを使用することを主張する場合は、2つの頂点だけでなくピクセルの列について話していることを覚えておく必要があります(これは結局のところピクセルシェーダーです)ので、すべてのピクセルをチェックする必要があります。変換がない場合を除いて、各ピクセルの変換の結果を知る方法がないため、これはおそらく問題です。ピクセルシェーダーで頂点値をクエリしないことをお勧めします。

これがあなたを正しい軌道に乗せることを願っています

于 2012-11-23T15:48:49.320 に答える