Unity记录一些glsl和hlsl的着色器Shader逆向代码

本文介绍了GLSL300版本后,OpenGLES中的clip剔除函数discard的使用,以及fragmentshader(FS)模块中颜色输出的计算过程,重点分析了如何通过逆向工程理解代码逻辑,特别是颜色叠加方程和纹理处理。
摘要由CSDN通过智能技术生成

以下内容一般基于 GLSL 300 之后

以下某些代码行,是“伪代码“,绝大部分是renderDoc 逆向产生标准代码

本人OpenlGL零基础,也不打算重头学

目录

Clip() 剔除函数 discard;

FS最终颜色输出 out 和最终颜色相加方程


Clip() 剔除函数 discard;

    _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模块颜色输出 out 和最终颜色相加方程

#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 可能是 diffuse 或者 ambient

因为方程式的前半部分,有乘以一个点积(dot方向),所以前半部分很可能是漫反射

所以,_28推断为环境光(ambient),因为环境光是不需要

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

参考资料-额外:

Layout Qualifier (GLSL) - OpenGL Wiki (khronos.org)

opengl - GLSL Uniform layout binding and textures - Stack Overflow

高级GLSL - LearnOpenGL-CN

以上链接分别有wiki,技术论坛讨论,中文论坛等等资料,都是不可多得的一手资料(其实也挺烂大街的,网上一搜索,多如牛毛) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值