シェーダーをコンパイルされた形式またはプレーンテキストで配布する必要がありますか?


13

GLSLで記述されたシェーダーを使用するアプリケーションがある場合、現実世界での配布とデスクトップおよびモバイルの最適な戦略は何ですか?

私はこれをバイナリ形式で、またはプレーンなシリアル化されたテキストとして配布することを目指しています。これについての良い提案をお願いします。

回答:


15

バイナリシェーダーを使用する主な理由は、テキストシェーダーのコンパイルがターゲットデバイスのワークロードに対して大きすぎる場合です。バイナリGLSLシェーダーには標準化された形式がないため、サポートするGPU /ドライバーごとに異なるものが必要になります。シェーダーをソース形式で配布し、最初の実行時にそれらをバイナリ形式にキャッシュし、その後そこから読み込むことをお勧めします。再度、バイナリを使用することを正当化するためにパフォーマンスボトルネックが実際にあるかどうかを最初にテストします。

考慮すべき点の1つは、オフラインテキストシェーダーオプティマイザーです。


シェーダーのコンパイルがボトルネックになっているデバイスを見つけることができたら、私は実際に驚くでしょう。コードの量は、大規模なシェーダーであっても、コンパイルの観点からは些細な量のコードです。
edA-qa mort-ora-y

1
Tapioが提案するように、そこにある大きなエンジンは通常、シェーダーをオフラインでコンパイルし、および/または最初の実行時にそれらをキャッシュします。シェーダーごとに些細な量のコードがあるかもしれませんが、それらをたくさん持つことができます。
ローランCouvidou

だから私はランダムなATIビデオカードとNvidiaから別のランダムなビデオカードを購入し、シェーダーをコンパイルしてコンパイルされたバージョンのみを配布する必要がありますか?対象のビデオカードのブランドを実行時に確認するにはどうすればよいですか?信頼できるものはありますか?
-user827992

1
@ user827992ベンダーが同じであっても、GPU /ドライバーの世代によってバイナリ形式が異なる場合があります。また、QualcommやPowerVRなど、すべてのモバイルGPUはもちろんのこと、多くのIntel GPUも存在することを忘れないでください。繰り返しになりますが、コンパイル済みのシェーダーは配布せず、ユーザーのデバイスで最初に実行するときにキャッシュすることをお勧めします。GPU検出に関しては、glGetString()からGL_VENDOR、GL_VERSION、およびGL_RENDERERの文字列を解析できますが、それらの形式はベンダーによって異なります。
タピオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.