Unity は glsl および hlsl シェーダーのリバース コードを記録します

以下の内容は通常、GLSL 300 以降に基づいています。

以下のコード行の一部は「疑似コード」であり、そのほとんどは renderDoc のリバース エンジニアリングされた標準コードです。

私には OpenlGL の基礎がまったくないので、もう一度勉強するつもりはありません。

目次

Clip() 削除関数の破棄;

FS 最終色出力出力と最終色加算式


Clip() 削除関数の破棄;

    _21 = texture(_7, _14);
    //.................
    _26 = _21.w + (-_33._m4);
    _29 = _21.xyz * _33._m3.xyz;
    _24 = _26 < 0.0;
    if (_24)
    {
        discard;
    }

Discard; コマンドから、一般に透明度 _26 == color.a によって削除されることがわかります。

_21.w は color.a にのみ対応します。

明らかに: _21 == _color; は v2f の色です

さらに押し上げると、_14 == uv であることがわかります。

FS モジュールの色出力と最終的な色加算式

#if FS
layout(location = 0) out vec4 _17;
//因为 —17为最终输出,所以通过逆向如下
//关键在于下面的方程式 _125 = XXXXXX + _XX;
main(){
    vec3 _125 = (_29 * vec3(_26)) + _28;
    _17 = vec4(_125.x, _125.y, _125.z, _17.w);
    _17.w = 1.0;//这行代码,不重要
}

この方程式 (-_125 色を求める)

vec3 _125 = (_29 * vec3(_26)) + _28;

拡散反射 (diffuse) + 環境光 (ambient) を想定します。

したがって、_28 は拡散または周囲波である可能性があります。

方程式の前半にはドット積 (ドットの方向) が乗算されるため、前半は拡散している可能性があります。

したがって、周囲光は必要ないため、_28 は周囲光 (ambient) として推論されます。

_26 = dot(_27, _19);
_28 = _29 * _33._m1.xyz;// _33.m1 是很奇怪的传入(binding==1)
_29 *= _33._m2.xyz;//虽然_33.m2也很奇怪

参考資料 - 追加:

レイアウト修飾子 (GLSL) - OpenGL Wiki (khronos.org)

opengl – GLSL均一レイアウトバインディングとテクスチャ - コードログ

高度な GLSL - OpenGL-CN を学ぶ

上記のリンクには、Wiki、技術フォーラムのディスカッション、中国のフォーラムなどの情報が含まれていますが、いずれも貴重な一次情報です (実際、かなりひどいものです。ネットで検索するとたくさん見つかります)。 

おすすめ

転載: blog.csdn.net/avi9111/article/details/132798279