3

GLSL コンパイラは多くの最適化を行っていると確信しています。特定のGLSLソース文字列が理解不能なASMまたはストレートGPUマシンコードに変換される直前に、その「最適化されたバージョン」を取得する方法があるかどうか(おそらくGLデバッグコンテキストまたは拡張機能を使用して?)があるかどうか疑問に思っています。

次の例を見てください。

vec3 fx_Noop (const in vec3 vCol) {
    return vCol;
}
vec3 fx_Tex2D (const in vec3 vCol) {
    return fx_Noop(texture(uni_Tex2D, var_Tex2D).rgb);
}

ここでは、fx_Noop() の定義全体とそれに対するすべての呼び出しを削除する必要がありますが、さらに重要なのは、fx_Tex2D() を次のように書き直す必要があることです。

vec3 fx_Tex2D () {
    return texture(uni_Tex2D, var_Tex2D).rgb;
}

vec3 vColのconstは使用されていないためです。

今では、すべての GL ドライバーと GLSL 実装の動作が異なることに気付きました。それでも、アセンブリ/コンパイル/リンクの直前に、ドライバーが特定の GLSL ソース文字列に対して行うことを正確に掘り下げたいと思います。

また、GLSLコーダーは上記のようなコードを書くべきではないことも認識していますが、多少実験的なコード生成シナリオでは、ほとんどのコンパイラ/実装が適切なクレンジングを適用することを知っているため、特定のトレードオフを安全に行うことができる場合、物事は大幅に簡素化されますとりあえず...

4

1 に答える 1

3

いいえ、さまざまなシェーダーをプロファイリングせずに、何らかの方法で確実に知る方法はありません。

于 2013-02-11T12:18:12.723 に答える