【Shader笔记】: 1. 性能方面注意事项

Shader笔记:性能优化注意事项

代码层面

1. 通过代数的方法尽量的减少运算
例如可通过在编写代码前先将一些可以计算掉项项先计算掉。

p = sqrt(2 * (x + 1));

修改为:

p = 1.414 * sqrt(x + 1)

2. 尽量使用内建函数。
这些函数大部分是硬件实现的,开发时可以直接利用,可降低代码复杂度,优化计算速度。基本上高代里常用的函数运算都是有的。

https://blog.csdn.net/hgl868/article/details/7876257

3. 如非必要,尽量少将一些运算封装为函数
这样能大大减少GPU函数调用与返回的消耗(目前这是GPU的弱项)

4. 用数学表达式代替分支语句
由于GPU与CPU在硬件结构上有较大差异,执行分支语句的效率非常低,因此往往需要想办法通过内建函数计算出因子,用数学表达式代替分支操作。

例如 将

void main() {
    vec2 uv = gl_FragCoord.xy/iResolution.xy;
    vec2 origin = vec2(0.5);
    if (distance(uv, origin) < 0.5) {
        gl_FragColor = vec4(0.0,1.0,1.0,1.0);
    } else {
        gl_FragColor = vec4(1.0,1.0,1.0,1.0);
    }
}

可改为

void main() {
    vec2 uv = gl_FragCoord.xy/iResolution.xy;
    vec2 origin = vec2(0.5);
    float dist = distance(uv, origin);
    
    float a = step(dist, 0.5);
    gl_FragColor = a * vec4(0.0,1.0,1.0,1.0) + (1.0 - a) * vec4(1.0,1.0,1.0,1.0);
}

5. 浮点型精度的选择
glsl 中 浮点型精度被分为 lowp,mediump, highp 三种。
通常highp 被用来描述
在这里插入图片描述
一般来说 顶点的位置会选用highp, texture coordinate 选用mediump,colors 选用lowp。

选用的时候注意,再效果满足需求的情况下能省则省。

6. 慎用一些高级的内建函数
https://zhuanlan.zhihu.com/p/34629262
知乎上有这样一张表,可以大致对比下各个函数的耗时。
在这里插入图片描述
大致就是反三角函数非常费;三角函数在旧硬件上成本较高,据说在现代GPU中,sin与cos的实现采用内置查表法,速度加快不少。不确定硬件情况尽可能少用。

参考资料

【1】https://blog.csdn.net/qq_35312463/article/details/108438410
【2】glsl内建函数
https://blog.csdn.net/hgl868/article/details/7876257
【3】数据精度https://blog.csdn.net/lzt20007/article/details/8731192
【4】慎用一些内建函数。
https://zhuanlan.zhihu.com/p/34629262

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值