热门标签 | 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


推荐阅读
  • 本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • EST:西湖大学鞠峰组污水厂病原菌与土著反硝化细菌是多重抗生素耐药基因的活跃表达者...
    点击蓝字关注我们编译:祝新宇校稿:鞠峰、袁凌论文ID原名:PathogenicandIndigenousDenitrifyingBacte ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 解决针织难题:R语言编程技巧与常见错误分析 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • Golomb 编码是一种高效的变长编码技术,专门用于整数的压缩。该方法通过预定义的参数 \( M \) 将输入整数分解为商 \( q \) 和余数 \( r \) 两部分。具体而言,输入整数除以 \( M \) 得到商 \( q \) 和余数 \( r \),其中商 \( q \) 采用一元编码表示,而余数 \( r \) 则使用二进制编码。这种编码方式在数据压缩和信息传输中具有显著的优势,特别是在处理具有特定概率分布的数据时表现出色。 ... [详细]
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社区 版权所有