新書推薦:
《
不挨饿快速瘦的减脂餐
》
售價:HK$
67.0
《
形而上学与存在论之间:费希特知识学研究(守望者)(德国古典哲学研究译丛)
》
售價:HK$
110.7
《
卫宫家今天的饭9 附画集特装版(含漫画1本+画集1本+卫宫士郎购物清单2张+特制相卡1张)
》
售價:HK$
132.2
《
化妆品学原理
》
售價:HK$
55.8
《
万千教育学前·与幼儿一起解决问题:捕捉幼儿园一日生活中的教育契机
》
售價:HK$
47.0
《
爱你,是我做过最好的事
》
售價:HK$
55.8
《
史铁生:听风八百遍,才知是人间(2)
》
售價:HK$
55.8
《
量子网络的构建与应用
》
售價:HK$
109.8
|
編輯推薦: |
本书推导解释了3D世界的1的具体含义,包括3D编程*常使用的5个坐标1的意义。对于透视投影的3D坐标1,推导了用户使用的透视投影变换。原创性地提出了一个透视投影的一般模型。基于这个一般模型做了一些数学算法上的改进,得到了基于透视除法的透视投影。此外,也分析了模型视图变换,窗口变换,纹理映射等对3D世界的1的影响。对于正交投影,则分析了基于正交投影的Skia的顶点坐标,纹理坐标特点,一些高级的3D编程概念如光线追踪,延迟渲染,阴影纹理等。
|
內容簡介: |
本书推导解释了3D世界的1的具体含义,包括3D编程*常使用的5个坐标1的意义。对于透视投影的3D坐标1,推导了用户使用的透视投影变换。原创性地提出了一个透视投影的一般模型。基于这个一般模型做了一些数学算法上的改进,得到了基于透视除法的透视投影。此外,也分析了模型视图变换,窗口变换,纹理映射等对3D世界的1的影响。对于正交投影,则分析了基于正交投影的Skia的顶点坐标,纹理坐标特点,一些高级的3D编程概念如光线追踪,延迟渲染,阴影纹理等。
|
關於作者: |
徐星,2007年硕士毕业于武汉大学无线电物理专业,工作后专注在操作系统的图形基础框架的开发。目前就职于Intel公司,从事Chromium图形系统的研发工作,是Chromium committer。
|
目錄:
|
第1章3D程序分析方法
1.1输入顶点数据
1.1.1描述顶点
1.1.2传递顶点
1.1.3绑定顶点缓冲区
1.2输入MVP数据
1.3输入纹理
1.3.1创建并传递纹理
1.3.2绑定纹理
1.4输出帧缓冲
1.5数据处理过程
1.6TensorFlow JS的输入输出
1.7Vulkan的输入输出
1.8GL和Vulkan的线程模型
1.9源码下载和编译
小结
第2章3D图形学基础
2.1符号和约定
2.2向量的基本运算
2.3齐次坐标
2.3.144齐次矩阵
2.3.2平行线相交
2.4顶点、三角形、片元
2.5光栅化原语
2.6视景体
2.7光照模型
小结
第3章透视投影
3.1左右手坐标系
3.23D坐标和坐标系
3.33D流水线
3.4小孔成像
3.5模型变换和世界变换的意义
3.6透视投影的几何模型
3.6.1眼睛坐标到投影坐标
3.6.2投影坐标到NDC坐标xy分量
3.6.3眼睛坐标到NDC坐标xy分量
3.6.4眼睛坐标到NDC坐标z分量
3.6.5裁剪
3.6.6透视投影的几何模型
3.6.7几何模型的算法分析
3.7透视投影的透视除法模型
3.7.1眼睛坐标到裁剪坐标xy分量
3.7.2眼睛坐标到NDC坐标zw分量
3.7.3透视除法
3.7.4裁剪
3.7.5FOV表示透视投影矩阵
3.7.6真实深度
小结
第4章视图变换和眼睛坐标系
4.1平移
4.2旋转
4.3视图变换矩阵
4.4示例
小结
第5章正交投影
5.1坐标系和坐标变换
5.2正交投影变换
小结
第6章视口变换
6.1NDC到窗口的变换
6.2NDC到[0, 1]的变换
小结
第7章3D顶点3D世界的1
7.1眼睛坐标
7.2正交投影
7.3透视投影
小结
第8章纹理坐标
8.1像素和多重采样
8.2三角形插值
8.2.1最近距离法
8.2.2加权距离法
8.2.3重心坐标法
8.3纹理映射和纹理坐标
8.3.1环绕模式
8.3.2非全窗口输出
8.3.3全窗口输出: NDC顶点坐标1,uv小于1
8.3.4全窗口输出: NDC顶点坐标1,uv大于1
8.3.5非归一化的纹理坐标
8.4点原语及其纹理坐标
8.5网格和纹理映射
8.5.1Blender介绍
8.5.2平面纹理映射
8.5.3球体纹理映射
小结
第9章VR枕形畸变
9.1理想薄凸透镜的放大率
9.2厚凸透镜的畸变
9.2.1厚凸透镜的基点和焦距公式
9.2.2厚凸透镜的畸变
9.2.3厚凸透镜放大率的泰勒级数
9.3畸变校正
9.3.1像差畸变校正
9.3.2像比例畸变校正
小结
第10章一种特殊的全窗口显示的方法
10.1三个顶点实现全窗口显示
10.20顶点实现全窗口显示
小结
第11章光线追踪
11.1正向追踪和逆向追踪
11.2光线追踪过程
11.3射线生成
11.4FOV、像的大小、占屏比
11.5光线追踪实现远小近大
11.6光线追踪平面
11.6.1射线和平面的关系
11.6.2射线和平面相交的实现
11.6.3Skybox
11.7光线追踪三角形
11.7.1射线和三角形的相交
11.7.2光线追踪三角形实现
11.8光线追踪球
11.8.1射线和球的相交
11.8.2光照计算
11.8.3光线追踪的1
11.9光线追踪的阴影实现
11.10光线追踪和光栅化对比
11.11示例
小结
第12章透视投影的其他应用
12.1双摄像头立体成像
12.2延迟渲染
12.2.1深度测试剔除所有被遮挡的点
12.2.2示例
12.3阴影
12.3.1生成最近深度纹理
12.3.2使用深度纹理
12.3.3示例
小结
第13章Skia
13.1Skia基础
13.1.1常用接口
13.1.2Skia矩阵
13.1.3测试方法
13.2Skia物体坐标和世界坐标
13.2.1物体坐标
13.2.2模型变换
13.3Skia纹理坐标
13.3.1顶点坐标不包含模型变换
13.3.2顶点坐标包含模型变换
13.4Skia正交投影
13.4.1正交投影
13.4.2窗口映射
13.4.3窗口映射对原点的影响
13.5Skia图像边缘检测
13.5.1Sobel算子
13.5.2实现边缘检测
小结
第14章一种通用的GPU多进程、多线程框架
14.1资源
14.2纹理Mailbox扩展
14.3同步Sync标记扩展
14.4资源的生命周期
14.4.1显示客户端生产资源
14.4.2显示客户端到显示合成器的IPC
14.4.3显示合成器使用资源
14.4.4删除资源
小结
参考文献
|
內容試閱:
|
本书源起于十年前作者从事Android图形编程时,对3D图形系统单位1的思考。2010年,是各大手机品牌和手机设计厂商热火朝天地定制Android界面的一年。在这股界面定制浪潮中,出现了很多3D桌面。当时作者所在的团队负责优化一个开源的3D桌面。这个3D桌面是一个六棱柱,棱柱的每个侧面都贴上了应用程序的图标。为了优化这个3D桌面,我们短暂地学习了OpenGL接口,也学会了编写3D的Hello World程序,但是在计算六棱柱坐标的时候碰到了问题。利用几何知识计算六棱柱坐标很简单,但是在应用了透视投影、模型视图变换、视口变换之后,我们不知道3D桌面里的六棱柱坐标是怎么计算出来的。具体到3D图形编程,六棱柱的计算问题可以描述为: ①3D程序里面,用户输入的顶点纹理坐标的单位1是什么,是窗口上的一个像素吗?或者说,如何定义顶点坐标和各种变换,将3D场景输出到整个窗口?②透视投影使用的视景体和投影矩阵是怎么得到的?3D编程接口的书籍里面并不容易找到这个问题的答案。
直到几年后,作者开始研究学习Chromium图形系统,重新思考总结这个问题,才意识到,学习3D编程和学习一门编程语言是有区别的。
在学习一门新的语言,例如CC或者其他语言的时候,一般都能很快地去编写一个Hello World程序,甚至实现一些更加复杂的功能。而对于3D编程,作者的感受是,看了图形学的书,学习了OpenGLVulkan编程接口,但是真正实战编程的时候,却发现不会写,也很难理解他人源码的设计逻辑。学习3D编程和学习一门编程语言的区别在于,3D编程的难点不是接口和语言本身,而是理解3D编程背后的几何数学原理。只有理解顶点纹理坐标1的含义、理解3D图形编程背后的几何数学原理,才能够真正去设计3D程序。
本书围绕主流开源项目里面涉及的3D顶点纹理1的含义、图形编程的几何数学原理展开内容。本书的从1开始具有以下三重含义。
本书主要内容是针对透视投影、正交投影、光线追踪等不同应用场景里面顶点纹理1和屏幕窗口上单位1之间的关系展开的。
大多数的编程模型,主要是为了解决三类问题: 应用的问题、数学的问题,以及应用和数学的问题。对于所有的数学问题而言,数学是根本,是1。3D编程接口就是为了解决应用和数学的问题而实现的一个编程模型,数学是这个问题里面的1。
如果从0开始学习3D编程是掌握3D编程接口,例如OpenGLVulkan,那么理解投影尤其是透视投影就是1。无论精通3D编程的哪种接口,如果不理解投影,就难以深入理解3D程序设计。
且慢,几何数学原理?霍金的一位朋友说过,书指的是《时间简史》里面每多一个公式,就会吓跑一半的读者。对于一个通俗读物通俗没有贬低的意思,作者的意思是,《时间简史》的读者主要不是从事理论物理研究的科学家,而是我们这些对浩渺宇宙充满好奇的普通大众,霍金的朋友对于公式的看法无疑是正确的。
似乎是从霍金开始,各种不需要数学基础的编程教程开始流行,例如零数学基础学习机器学习等。如果你只是一个管理人员,或者仅仅是好奇,零数学的书籍无疑非常适合阅读。但是,对于一个从事专业工作的软件工程师而言,通过零数学学习到的知识,对于在软件项目中解决问题帮助不大。所以对于3D图形编程而言,数学是一个非常重要的工具,想要真正去设计一个3D程序,无法绕开3D相关的数学知识。目前中美贸易激战正酣,美国想要在芯片和软件系统领域挤压国内企业的生存空间。大国之间的博弈,本质上是数学等基础科学的博弈。华为任正非说过,芯片软件也如此等需要数学家、物理学家、化学家。作者深以为然,理解一切事物的本质,离不开这些基础科学。
不过,读者也不需要担心。本书用到的数学知识,都来自开源项目的源代码,是围绕着理解和解决3D工程实践上的具体问题展开的,而不是针对数学家的。这些数学知识,都可以用源代码进行测试验证,所以主要是高中的立体几何知识和一些大学低年级的矩阵运算知识。矩阵运算主要是矩阵的乘法。此外,在介绍虚拟现实的透镜的畸变问题时,用到了泰勒级数。在介绍Skia边缘检测的时候,用到了方向导数。透镜的畸变和边缘检测属于选读的内容,没有需要的读者可以略过。
除了数学知识,因为本书是从1开始3D图形编程,而不是从0开始,所以要求读者对OpenGLVulkan的编程接口有基本了解。
本书从透视投影、正交投影、光线追踪三个方面对3D程序顶点纹理坐标1的含义,以及相关的几何数学原理进行分析。对于透视投影的3D坐标1,本书推导了用户使用的透视投影变换。和其他文献对透视投影的解释不同的是,本书提出了透视投影的几何模型。这个模型不考虑性能的问题,仅要求几何原理上的正确,因此这个模型相对容易理解。然后,基于这个几何模型做了一些数学算法上的改进,得到了基于透视除法的透视投影。也分析了模型视图变换、视口变换、纹理映射等对3D世界的1的影响。本书分析了一些基于透视投影的3D编程概念,如双摄像头立体成像、延迟渲染、阴影,以及虚拟现实透镜产生的畸变等。对于正交投影,分析了正交投影的基本变换,同时分析了基于正交投影的Skia,包括Skia的顶点坐标、纹理坐标的特点。此外,本书还分析了光线追踪的基本原理,并利用计算着色器模拟了部分物体的光线追踪。最后,本书还介绍了一种通用的GPU多进程、多线程模型。
为了降低分析3D问题的复杂度,除了前面提到的将透视投影拆分为几何模型和透视除法模型之外,本书还在分析透视投影矩阵的时候,将模型视图矩阵简化为单位矩阵,这样的简化,不影响结论的通用性,但是可以较好地降低问题的复杂度,同时也使测试验证问题变得更加简单。
感谢我的家人。尤其感谢我的妻子,她理解支持我的写作,同时她也花了大量个人时间对本书进行了文字和格式上的校订。也感谢我的儿子承承,每当我推导一个公式快要放弃的时候,看着身旁认真下围棋的他,我又重拾了勇气。
感谢英特尔公司。感谢公司开放的氛围,让我有业余时间去探索一些工程实践中碰到的几何数学问题。也感谢公司那些优秀聪明的同事,感谢在GPU图形领域耕耘多年的叶建军,他给本书的编写提出了多处修改意见。
最后,感谢清华大学出版社的黄芝编辑,她为作者提供了很多排版布局方面的建议,最重要的是,给本书提供了一个合适的名字。
作者才疏学浅,书中疏漏在所难免,读者如果有任何反馈意见,欢迎与作者取得联系。
作者
2020年2月
|
|