5

OpenGL を使用して作成しているゲームの車を描画しようとしています。car オブジェクトは、付随する .mtl ファイルとともに .obj ファイルに格納されます。

車には 500 以上の頂点と 100 以上の面があり、独自の頂点シェーダーとフラグメント シェーダーを使用して、50 以上の異なるテクスチャを適用する必要があります。オブジェクトに関するすべての情報を一度に送信するバッファ オブジェクトを使用して、これを実現しました。私の問題は、同じオブジェクトの異なる表面に異なるテクスチャを適用しようとすることです。

この問題に対して私が見つけた答えは、テクスチャを特定のテクスチャ番号 (GL_TEXTURE0、GL_TEXTURE1 など) にバインドし、それを参照するフラグメント シェーダに Sampler2D を渡すことです。しかし、この方法で 50 を超えるテクスチャを保存できますか? 私が知る限り、それは GL_TEXTURE32 です。

また、車のオブジェクトの特定の面にのみテクスチャを適用するようにシェーダーに指示するにはどうすればよいでしょうか?

4

3 に答える 3

10

一度にすべてのテクスチャをバインドするこの方法でモデルをレンダリングすることはできません。フラグメント シェーダーは、ハイエンドの GL 4.1 クラスのハードウェアであっても、16 のテクスチャしかアクセスできません。つまり、サンプラーは 16 個しか持てません。

他のシェーダー ステージでもテクスチャを使用できるため、テクスチャの合計数は多くなります。

これに対処する正しい方法は、次のいずれかを実行することです。

  1. モデラーに戻って、モデルのテクスチャ数を減らしてもらいます。
  2. モデルのテクスチャ座標を適切に変更して、ツールでテクスチャ アトラスを作成します (つまり、すべての画像を 1 つのテクスチャに配置します)。サポートする予定のハードウェアに応じて、これは大きな 2D テクスチャまたは 2D テクスチャ配列になります。後者には、テクスチャ座標の 3 番目の値、つまり配列内の画像のインデックスが必要です。
  3. 三角形をテクスチャで並べ替えます。テクスチャごとに、そのテクスチャを使用するすべての三角形をレンダリングします。

#3 は、データの変更を必要としない唯一のソリューションです。ただし、注意してください。この車を頻繁に (たとえば、フレームごとに数千回) レンダリングすると、状態変更のオーバーヘッドがパフォーマンスの問題になる可能性があります。#1 と #2 のいくつかの組み合わせは、一般的に推奨される方法です。

ところで、モデルに数百の面しかなく、50のテクスチャしかない場合は、モデリング プロセスで何かがひどく間違っている可能性があります。

于 2011-07-22T10:13:10.360 に答える
2

単純な方法ではなく、そのように任意の数のテクスチャを使用することはできません。

基本的に3つの解決策があります:

  • 使用するテクスチャを減らす
    • いくつかの個別のテクスチャをアトラスにパックします。これには、テクスチャ座標を調整し、ミップマップの作成に注意する必要があります (ただし、まともなツールが自動的にそれを行います)。異方性フィルタリングにも十分な境界を残すように注意する必要がある場合があります。
    • 複数の個々のテクスチャを 1 つの配列テクスチャにパックします。mipmaps と aniso には問題ありませんが、ハードウェア サポート (GL 3.1 カード) が必要です。
  • モデルを分割する
    • より多くのドロー コールとより多くの状態変更と車ごとのパイプライン ストール(パフォーマンスに悪い)
    • 解決策: たとえば、すべての車体を 1 つのバッチに、すべてのタイヤを 1 つのバッチに、すべてのライトを別のバッチに描画して、状態の変化を減らします。
  • ディテール テクスチャリングを使用し、「全体的にディテールの低い」テクスチャを少なくする
    • 地形でテクスチャリングを行う方法に似ています
    • ピクセル シェーダーで組み合わせて各車に個別の外観を与える
于 2011-07-22T10:11:30.783 に答える
0

1 つのオブジェクトに対して 50 のテクスチャを切り替えると、すぐにパフォーマンスの悪夢に変わります。テクスチャ アトラスを使用します。

マルチテクスチャリングは、カラー レイヤー、バンプ レイヤー、光沢などの複数のテクスチャ レイヤーを提供することを目的としています。ただし、アトラスの代わりに使用することはできません。

また、モデルが異なる素材のパーツで構成されている場合は、分割してください。独自のメッシュ内の各マテリアル。

于 2011-07-22T10:11:42.000 に答える