13

Radeon HD 3850を搭載したラップトップ用にゲームのレンダラーを調整しています。このチップはかなりの処理能力を備えていますが、メモリ帯域幅が限られているため、より多くのシェーダー作業をより少ないパスに移動しようとしています。

以前は、単純なマルチパスモデルを使用していました。

  • FP16ブレンドバッファーをバインドしてクリアします(デプスバッファー付き)
    • 深度のみのパス
    • ライトごとに、追加のライトパスを実行します
  • バックバッファをバインドし、テクスチャとしてブレンドバッファを使用します
    • トーンマッピングパス

このメソッドのパフォーマンスを向上させるために、ライトの数とタイプをカウントしてカスタムGLSLシェーダーを動的に構築する新しいレンダリングパスを作成しました。これらのシェーダーは、すべてのライトパラメーターをユニフォームとして受け入れ、すべてのライティングを1回のパスで実行します。なんらかの限界にぶつかると思っていたので、まずは1灯でテストしました。それから3つ。次に21で、エラーやアーティファクトがなく、優れたパフォーマンスを発揮します。これは私の実際の質問につながります:

ユニフォームの最大数は取得できますか?

この方法は古いハードウェアで実行可能ですか、それともユニフォームははるかに制限されていますか?

押しすぎると、どの時点でエラーが発生しますか?シェーダーのコンパイル?プログラムのリンク?プログラムを使用していますか?

4

4 に答える 4

11

シェーダーユニフォームは通常、ハードウェアによってレジスターとして実装されます(または、nVidiaフラグメントシェーダーなどのシェーダーマイクロコードに値を直接パッチすることによって)。したがって、制限は実装に大きく依存します。

頂点シェーダーとフラグメントシェーダーをそれぞれクエリGL_MAX_VERTEX_UNIFORM_COMPONENTS_ARBして最大値を取得できます。GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB

于 2009-11-24T20:59:29.433 に答える
3

4.3.5 The OpenGL® Shading Language仕様の統一を参照してください。

各タイプのシェーダーに使用できるユニフォームのストレージ量には、実装に依存する制限があり、これを超えると、コンパイル時またはリンク時のエラーが発生します。宣言されているが使用されていない均一変数は、この制限にカウントされません。

リンクまたはコンパイル時に失敗しますが、プログラムを使用していません。

于 2009-11-24T21:02:31.297 に答える
2

OpenGL 実装でサポートされている最大数を取得する方法については、moonshadow の回答を参照してください。

任意の GPU の制限が実際にどこにあるのかを知るには、GPU がサポートしている DX のバージョンを確認することをお勧めします。

DX9 レベルのハードウェア:

  • vs2_0256 vec4 をサポートします。ps2_032 の vec4 をサポートします。
  • vs3_0は 256 vec4、224 ps3_0vec4 です。

DX10 レベルのハードウェア:

vs4_0/ps4_0定数バッファーごとに最小で 4096 個の定数があり、そのうち 16 個を持つことができます。

要するに、DX10 ベースのものが不足する可能性はほとんどありません。

于 2009-11-24T21:15:39.757 に答える
-6

ユニフォームの最大数は変数なので、ビデオメモリの量によって決まると思います。CPUの通常の変数は、RAMによって制限されていますよね?

于 2009-11-24T20:44:22.613 に答える