作者:daadhkiw_267 | 来源:互联网 | 2024-11-15 10:39
本文转载自:https://zhuanlan.zhihu.com/p/130428432
前言
在学习HDR格式和RGBE编码的过程中,我萌生了一个关于优化Shader中数学函数计算的想法。虽然游戏厂商在这方面可能已经有丰富的经验,但公开的资料相对较少,因此我整理了一些相关内容。
渲染优化不仅涉及场景管理、LOD、管线优化、裁剪、分辨率和mipmaps等技术,还可以从计算层面进行优化。本文主要介绍一些常用的耗时公式的优化方法。
公式优化的基本思路是:如果库函数效率不高,可以使用特化版本或近似版本。通过不断积累,形成一个高效的快速计算数学库。
本文内容多来自IDTech6、7和GitHub上的一个开源库:
https://github.com/michaldrobot/ShaderFastLibs/blob/master/ShaderFastMathLib.h
我重新整理了一份,并添加了一些新的内容,放在GitHub上:
https://github.com/ifeuille/FastMathTests/blob/master/ShaderFastMathLib.h
前置计算机或数学基础知识关键词:ALU、Newton-Raphson迭代、IEEE
特化方法
1. pow(x)
直接使用特化版本,例如:
float pow(float x, float y) { ... }
近似方法
pow(x)
这是在IDTech6、7中看到的一种方法:
float fast_pow(float x, float y) { ... }
log2(x)
同样来自IDTech6、7:
float fast_log2(float x) { ... }
exp2(x)
这也是在IDTech6、7中看到的:
float fast_exp2(float x) { ... }
RCP
// RCP
float fast_rcp(float x) { ... }
基于NR的sqrt
// 基于IEEE浮点数算法的近似值计算
float fast_sqrt(float x) { ... }
acos
使用4阶多项式逼近:
4 VGRP, 16 ALU
7*10^-5弧度精度
参考资料:Handbook of Mathematical Functions (chapter : Elementary Transcendental Functions), M. Abramowitz and I.A. Stegun, Ed.
float fast_acos(float x) { ... }
asin
使用4阶多项式逼近:
4 VGRP, 16 ALU
7*10^-5弧度精度
float fast_asin(float x) { ... }
atan
使用4阶多项式逼近:
4 VGRP, 12 ALU
7*10^-5弧度精度
参考资料:Efficient approximations for the arctangent function, Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006
float fast_atan(float x) { ... }
参考资料
https://github.com/michaldrobot/ShaderFastLibs/blob/master/ShaderFastMathLib.h
Efficient approximations for the arctangent function, Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006
Handbook of Mathematical Functions (chapter : Elementary Transcendental Functions), M. Abramowitz and I.A. Stegun, Ed.
https://github.com/ifeuille/FastMathTests/blob/master/ShaderFastMathLib.h