首页 > 图书中心 >图书详情
从“1”开始3D编程
作者:徐星
丛书名:清华科技大讲堂
定价:49.80元
印次:1-1
ISBN:9787302548041
出版日期:2020.07.01
印刷日期:2020.06.28
本书推导解释了3D世界的1的具体含义,包括3D编程最常使用的5个坐标1的意义。对于透视投影的3D坐标1,推导了用户使用的透视投影变换。原创性地提出了一个透视投影的一般模型。基于这个一般模型做了一些数学算法上的改进,得到了基于透视除法的透视投影。此外,也分析了模型视图变换,窗口变换,纹理映射等对3D世界的1的影响。对于正交投影,则分析了基于正交投影的Skia的顶点坐标,纹理坐标特点,一些高级的3D编程概念如光线追踪,延迟渲染,阴影纹理等。
more >前言 本书源起于十年前作者从事Android图形编程时,对3D图形系统单位1的思考。2010年,是各大手机品牌和手机设计厂商热火朝天地定制Android界面的一年。在这股界面定制浪潮中,出现了很多3D桌面。当时作者所在的团队负责优化一个开源的3D桌面。这个3D桌面是一个六棱柱,棱柱的每个侧面都贴上了应用程序的图标。为了优化这个3D桌面,我们短暂地学习了OpenGL接口,也学会了编写3D的“Hello World”程序,但是在计算六棱柱坐标的时候碰到了问题。利用几何知识计算六棱柱坐标很简单,但是在应用了透视投影、模型视图变换、视口变换之后,我们不知道3D桌面里的六棱柱坐标是怎么计算出来的。具体到3D图形编程,六棱柱的计算问题可以描述为: ①3D程序里面,用户输入的顶点纹理坐标的单位1是什么,是窗口上的一个像素吗?或者说,如何定义顶点坐标和各种变换,将3D场景输出到整个窗口?②透视投影使用的视景体和投影矩阵是怎么得到的?3D编程接口的书籍里面并不容易找到这个问题的答案。 直到几年后,作者开始研究学习Chromium图形系统,重新思考总结这个问题,才意识到,学习3D编程和学习一门编程语言是有区别的。 在学习一门新的语言,例如C/C++或者其他语言的时候,一般都能很快地去编写一个“Hello World”程序,甚至实现一些更加复杂的功能。而对于3D编程,作者的感受是,看了图形学的书,学习了OpenGL/Vulkan编程接口,但是真正实战编程的时候,却发现不会写,也很难理解他人源码的设计逻辑。学习3D编程和学习一门编程语言的区别在于,3D编程的难点不是接口和语言本身,而是理解3D编程背后的几何数学原理。只有理解顶点纹理坐标1的含义、理解3D图形编程背后的几何数学原理,才能够真正去设计3D程序。 本书围绕主流开源项目里面涉及的3D顶点纹理1的含义、图形编程的几何数学原理展开内容。本书的“从1开始”具有以下三重含义。 本书主要内容是针对透视投影、正交投影、光线追踪等不同应用场景里面顶点纹理1和屏幕窗口上单位1之间的关系展开的。 大多数的编程模型,主要是为了解决三类问题: 应用的问题、数学的问题,以及应用和数学的问题。对于所有的数学问题而言,数学是根本,是1。3D编程接口就是为了解决应用和数学的问题而实现的一个编程模型,数学是这个问题里面的1。 如果从0开始学习3D编程是掌握3D编程接口,例如OpenGL/Vulkan,那么理解投影尤其是透视投影就是1。无论精通3D编程的哪种接口,如果不理解投影,就难以深入理解3D程序设计。 且慢,几何数学原理?霍金的一位朋友说过,书(指的是《时间简史》)里面每多一个公式,就会吓跑一半的读者。对于一个通俗读物(通俗没有贬低的意思,作者的意思是,《时间简史》的读者主要不是从事理论物理研究的科学家,而是我们这些对浩渺宇宙充满好奇的普通大众),霍金的朋友对于公式的看法无疑是正确的。 似乎是从霍金开始,各种不需要数学基础的编程教程开始流行,例如零数学基础学习机器学习等。如果你只是一个管理人员,或者仅仅是好奇,零数学的书籍无疑非常适合阅读。但是,对于一个从事专业工作的软件工程师而言,通过零数学学习到的知识,对于在软件项目中解决问题帮助不大。所以对于3D图形编程而言,数学是一个非常重要的工具,想要真正去设计一个3D程序,无法绕开3D相关的数学知识。目前中美贸易激战正酣,美国想要在芯片和软件系统领域挤压国内企业的生存空间。大国之间的博弈,本质上是数学等基础科学的博弈。华为任正非说过,芯片(软件也如此)等需要“数学家、物理学家、化学家”。作者深以为然,理解一切事物的本质,离不开这些基础科学。 不过,读者也不需要担心。本书用到的数学知识,都来自开源项目的源代码,是围绕着理解和解决3D工程实践上的具体问题展开的,而不是针对“数学家”的。这些数学知识,都可以用源代码进行测试验证,所以主要是高中的立体几何知识和一些大学低年级的矩阵运算知识。矩阵运算主要是矩阵的乘法。此外,在介绍虚拟现实的透镜的畸变问题时,用到了泰勒级数。在介绍Skia边缘检测的时候,用到了方向导数。透镜的畸变和边缘检测属于选读的内容,没有需要的读者可以略过。 除了数学知识,因为本书是从1开始3D图形编程,而不是从0开始,所以要求读者对OpenGL/Vulkan的编程接口有基本了解。 本书从透视投影、正交投影、光线追踪三个方面对3D程序顶点纹理坐标1的含义,以及相关的几何数学原理进行分析。对于透视投影的3D坐标1,本书推导了用户使用的透视投影变换。和其他文献对透视投影的解释不同的是,本书提出了透视投影的几何模型。这个模型不考虑性能的问题,仅要求几何原理上的正确,因此这个模型相对容易理解。然后,基于这个几何模型做了一些数学算法上的改进,得到了基于透视除法的透视投影。也分析了模型视图变换、视口变换、纹理映射等对3D世界的1的影响。本书分析了一些基于透视投影的3D编程概念,如双摄像头立体成像、延迟渲染、阴影,以及虚拟现实透镜产生的畸变等。对于正交投影,分析了正交投影的基本变换,同时分析了基于正交投影的Skia,包括Skia的顶点坐标、纹理坐标的特点。此外,本书还分析了光线追踪的基本原理,并利用计算着色器模拟了部分物体的光线追踪。最后,本书还介绍了一种通用的GPU多进程、多线程模型。 为了降低分析3D问题的复杂度,除了前面提到的将透视投影拆分为几何模型和透视除法模型之外,本书还在分析透视投影矩阵的时候,将模型视图矩阵简化为单位矩阵,这样的简化,不影响结论的通用性,但是可以较好地降低问题的复杂度,同时也使测试验证问题变得更加简单。 感谢我的家人。尤其感谢我的妻子,她理解支持我的写作,同时她也花了大量个人时间对本书进行了文字和格式上的校订。也感谢我的儿子承承,每当我推导一个公式快要放弃的时候,看着身旁认真下围棋的他,我又重拾了勇气。 感谢英特尔公司。感谢公司开放的氛围,让我有业余时间去探索一些工程实践中碰到的几何数学问题。也感谢公司那些优秀聪明的同事,感谢在GPU图形领域耕耘多年的叶建军,他给本书的编写提出了多处修改意见。 最后,感谢清华大学出版社的黄芝编辑,她为作者提供了很多排版布局方面的建议,最重要的是,给本书提供了一个合适的名字。 作者才疏学浅,书中疏漏在所难免,读者如果有任何反馈意见,欢迎与作者取得联系。 作者 2020年2月
more >