热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化Shader中复杂数学函数的高效计算方法

本文介绍了在Shader中优化常见数学函数的方法,包括特化和近似计算,以提高渲染性能。这些方法适用于HDR格式和RGBE编码的优化。

本文转载自: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


推荐阅读
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 由中科院自动化所、中科院大学及南昌大学联合研究提出了一种新颖的双路径生成对抗网络(TP-GAN),该技术能通过单一侧面照片生成逼真的正面人脸图像,显著提升了不同姿态下的人脸识别效果。 ... [详细]
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 国际高保真音乐流媒体平台的崛起:亚马逊与谷歌的竞争策略
    近期,亚马逊和谷歌正积极筹备推出高保真音乐流媒体服务,预计在2019年底前上线。根据市场研究机构CIRP的数据,截至2018年12月,美国智能音箱的安装量已增至6600万台,较第三季度增长显著。这一趋势对Spotify等传统流媒体平台构成了新的挑战。 ... [详细]
  • 本文详细介绍了 Java 中 org.geotools.data.shapefile.ShapefileDataStore 类的 getCurrentTypeName() 方法,并提供了多个代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
author-avatar
daadhkiw_267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有