【cg】【pbr】基于物理的渲染理论与实现
前言
基于物理的渲染,即PBR,是一种有别于传统经验模型的光照模型。折腾这个PBR,一方面是想对渲染管线和流程有更进一步的理解,对GPU编程有一定的认识和经验,另一方面,通过对基于OpenGL的3D游戏引擎的实现做一种尝试,不仅可以锻炼架构能力,还能对c++新的语法有更进一步的认识,了解了一些图形学的基础功能的实现,并锻炼使用了c++宏编程实现了委托机制和反射机制,为进一步实现序列化提供基础。同时编写了自己的数学库,推导了矩阵的各种仿射变换,以及旋转矩阵的推导,利用四元数进行旋转的原理与实现,正交/透视投影矩阵的推导和实现等,加强了图形学知识的数学基础,为进一步学习做准备。
结果
前前后后折腾了两三个月,最后搞下来答辩的时候成了下面这个鬼样子。
![test scene](/post/3dc7a35e/pic01.png)
![test scene](/post/3dc7a35e/pic02.png)
![result](/post/3dc7a35e/pic03.png)
![result-1](/post/3dc7a35e/pic04.png)
![result-2](/post/3dc7a35e/pic05.png)
![result-3](/post/3dc7a35e/pic06.png)
源码总共2万行左右,大部分使用c++语言实现,渲染部分使用原生opengl的api,shader使用glsl实现,几乎没有使用第三方库,除了读取模型使用的assimp
,自己也写了一个读取obj格式的,但是效果不好。数学库也是自己边推导边实现的,可能有的地方是错误的,待以后查验。
文档
结语
个人感觉对PBR的基本研究还算认真,从最初的理论一直到最终间接光照的实现,几乎每一步都有仔细地推导了一下,拾人牙慧也要拾的认真才好。
容我展望一下未来。
下一步打算继续补充一些实现中的数学推导的博客,如四元数、投影矩阵等,同时补充一下图形学相关的一些基础实现,如uv mapping、gamma校正、HDR、bloom、法线贴图、立方体贴图、动态环境立方体及动态环境映射等。
再后面,打算阅读一下ue4引擎的渲染相关的代码,看看当前实验性的知识是如何在商业引擎中实现的,也许那到时从课本上学到的东西才能得到印证。
时不我待,少年仍需努力。
\(^o^)/
参考文献
[1] Burley B, Studios W D A. Physically-based shading at disney[C]. ACM SIGGRAPH, 2012: 1-10.
[2] Alvy Ray Smith. Gamma Correction [J]. Technical Memo 9, 1995.01: 1-4.
[3] Erik Reinhard. High dynamic range imaging [M]. Amsterdam, 2010.
[4] 连瑞梅. 简单光反射模型(Phong 模型)的导出[J]. 科技广场, 2007.
[5] Linus Källberg, Thomas Larsson. Optimized Phong and Blinn-Phong Glossy Highlights [J]. Journal of Computer Graphics Techniques, 2014.03: 1-5.
[6] 金伟其, 胡威捷. 辐射度 光度与色度及其测量[M]. 北京理工大学出版社, 2006.
[7] Matt Pharr, Greg Humphreys. Physically Based Rendering Third Edition [M]. Elsevier/Morgan Kaufmann, 2004.
[8] Naty Hoffman. Background: Physics and Math of Shading [C]. ACM SIGGRAPH, 2012: 1-36.
[9] RL Cook, KE Torrance. A Reflectance Model for Computer Graphics [C]. ACM Transactions on Graphics (TOG), 1981.
[10] C Schlick. An inexpensive BRDF model for physically‐based rendering [C]. Computer graphics forum, 1994.
[11] Michał Iwanicki, Angelo Pesce. Approximate Models for Physically Based Rendering [C]. ACM SIGGRAPH, 2015: 1-45.
[12] Kevin Suffern. Ray tracing from the ground up [M]. A K Peters, 2007.
[13] Brian Karis, Epic Games. Real Shading in Unreal Engine 4 [C]. ACM SIGGRAPH, 2013: 1-19.
[14] Christophe Hery, Ryusuke Villemin, Epic Games. Physically Based Shading at Pixar [C]. ACM SIGGRAPH, 2013: 1-10.
[15] 彭群生. 计算机真实感图形的算法基础[M]. 科学出版社, 1999.
[16] Tomas Möller, Eric Haines. Real-Time Rendering 4th [M]. A K Peters, 2018.
[17] Randi J. Rost. OpenGL 着色语言[M].人民邮电出版社, 2006.
[18] Jason Gregory, 叶劲峰译. 游戏引擎架构[M].电子工业出版社, 2014.
[19] 浅墨. 基于物理的渲染(PBR)白皮书[EB/OL]. 知乎 , https://zhuanlan.zhihu.com/p/53086060
[20] i_dovelemon 的csdn主页 主要关于采样分布映射等数学基础的讲解 https://blog.csdn.net/i_dovelemon