通常、一度にいくつのテクスチャをバインドできますか?


23

私はゲームエンジンを開発していますが、最新の(Shaderモデル4+)ハードウェアでのみ動作します。私はそれを使い終えるまでに、それはそのような不合理な要件ではないだろうと考えています。

私の質問は、最新のグラフィックカードに一度にいくつのテクスチャをバインドできるかということです。16で十分でしょう。ほとんどの最新のグラフィックスカードがその数のテクスチャをサポートすると期待できますか?

私のGTX 460は32をサポートしているように見えますが、それが最新のビデオカードの代表かどうかはわかりません。


どのレンダリングAPIを使用していますか?
アダム

2
もちろんOpenGL :)
Avi

回答:


53

OpenGLにバインドできるテクスチャの数は32または16ではありません。それはあなたが得るものではありませんglGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);。この関数は、フラグメントシェーダーがアクセスできるテクスチャの数を取得します。

シェーダーには使用できるテクスチャの数に独自の制限があります。ただし、使用できるテクスチャの合計数、期間もあります。これは(OpenGLで)によって定義されていGL_MAX_COMBINED_TEXTURE_IMAGE_UNITSます。

そのため、2つの制限があります:ステージごとのテクスチャと、テクスチャの合計バウンドです。

OpenGL 3.xは、ステージごとの制限の最小数を16に定義しているため、ハードウェアがステージごとに16未満のテクスチャを持つことはできません。より高い制限を持つこともできますが、少なくとも16が得られることがわかります。3.xはtextures-total-boundの最小数を48として定義します。AKA:16 * 3ステージ。同様に、GL 4.xでは、1ステージあたり16テクスチャ、合計96テクスチャ(つまり、16 * 6ステージ、計算シェーダーを含む)になるように数値を定義しています。

繰り返しますが、これらは最小数です。ハードウェアはさまざまです(実際に異なります)。

特定のハードウェアに関しては、DX10クラスのハードウェアがこれらの数値と一致すると予想できます。DX11クラスのハードウェアには多少の違いがあります。NVIDIA(GeForce 4xx +)およびハイエンドAMDチップ(別名:GCNコア)には、ステージあたり16個を超える可能性があります。


2
これが受け入れられた答えだったらいいのに。5分の無意味な読書を節約できただろう。
フィブル

3

現在バインドできるテクスチャの最大数は32だと思います。私が知る限り、8800シリーズでさえ32のテクスチャユニットがありました。

私の知る限り、openGL 4.xをサポートするには、Fermiまたは新しいnvidiaカード(または対応するamdカード)が必要です。ハイエンドモデルにはすべて32ユニットがあり、最低エンドカード(GT 430など) )16。ただし、AMDスペックシートを見ると、80または128のテクスチャユニットなどの数字がリストされていますが、32のカラーROPユニットがリストされています。

一方、GTX 480には60のテクスチャユニットと48のROPユニットがリストされていますが、430のようなローエンドカードには16のテクスチャユニットと4のROP初期値しかありません。ですから、全体として、あなたが実際に探している数字がこれらのいずれかであるとは本当に確信していません。

glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);ただし、を使用して、固定されていない関数パイプラインレンダリングに使用できるテクスチャユニットの数を確認できます。そのため、さまざまなハードウェアにアクセスできる場合は、自分で確認できます。

編集:このサイトでは、あらゆる種類のビデオカードの報告されたopenGL機能を比較できます。これにより、必要な数値が得られます:http : //feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS:AMDとnvidiaは最近、「バインドレステクスチャ」を導入しました(amdには別の名前があります)。これにより、textutreユニットにバインドせずに多数のテクスチャを使用できます。現時点ではopenGLでのみ使用できます。


1
それに続いて、本当の答えは「ハードウェアが提供できる限り多く持っています」のようなものです。または、言い方を変えれば、すべてができるだけ速く実行されるはずです。(およびほぼすべてのフィールドをカバーするOpenGLで)。
ダークウィングス

@Darkwingsだから、ハードウェアが処理できる以上のテクスチャをバインドすると、通常はエラーが発生するか、ドライバーがタイムアウトします。私も誤解した、彼はシェーダーモデル4+ではなくopengl 4+だと言った。最初のDX10カード(X2900および8800ファミリのカード)を見ると、これらはすべて少なくとも16のテクスチャユニットを持っているようです。

パラメータ化できるので、そうすべきであるという事実を強調しただけです。ゲームが古いカードでクロールする場合でも、ハードコーディングされたものではなく、「推奨される要件」である必要があります。
ダークウィングス

4
-1:この答えは間違っています。理由については私の回答をご覧ください(ここで説明するには長すぎます)。
ニコルボーラス

1
すぐには明らかにならないことがあります。GL_TEXTURE n GLenumsを使用する人はほとんどいません。代わりにGL_TEXTURE0 + nを使用します。nはバインドするスロットです。GLenumは最大32スロットになりますが、それはOpenGLが32スロットに制限することを意味するものではありません。仕様はそれらが連続することを保証します。また、DSAを使用していない場合、bind-to-create / modify用のスロットを予約すると、create / modifyに使用される状態と描画に使用される状態との相互作用が少なくなります。
マキシマスミニマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.