这文章记录一些关于计算机的知识,我觉得程序员应该可以看看,大部分都是抽象,我们在写代码或者在做程序的时候,不用在乎底层知识,我们只需要写,编译器会帮我们处理成想要的样子,我觉得硬件底层是很复杂的一个东西,它不仅仅是编程的逻辑判断,还有物理知识,电的知识,这篇文章是一个个抽象来理解计算机,所以我们不用关心底层什么 ALU,或者 计算等等。
这篇文章不只是记录,也写包括我的理解,可能不是很对,有错误请给提 issues。
感谢CrashCourse 字幕组 以及 Crash Course 你们很棒.
3D 图形的基础知识
可以写一个函数,从 A 到 B 画一条线,通过控制 A 和 B 的(x,y)坐标,可以控制一条线,在 3D 图像中,点的坐标不再是两点,而是三点,x,y,z。
当然,2D的电脑屏幕上不可能有 XYZ 立体坐标轴,所以有图形算法负责把 3D 坐标 “拍平” 显示到 2D屏幕上 这叫 3D投影。
所有的点都从3D转成2D后,就可以用画2D线段的函数,来连接这些点。这叫 “线框渲染”。
墙上的影子就是投射,是平的。如果旋转立方体,投影看起来会像 3D 物体,尽管是投影面是平的,电脑也是这样 3D 转 2D 。只不过用大量数学,而不是筷子
3D 投影有好几种
你现在看到的,叫 正交投影。
立方体的各个边,在投影中互相平行,在真实3D世界中,平行线段会在远处收敛于一点。
这叫 透视投射
过程是类似的,只是数学稍有不同,有时你想要投射投影,有时不想,具体取决于开发人员。
在 3D 图形学中,我们叫 三角形 为 “多边形(Polygons)”
游戏设计者要平衡角色的真实度和多边形数量,如果数量太多,帧率会下降到肉眼可感知,用户会觉得卡,因此有算法用来简化网络。之所以三角形更常用,而不是用正方形,或其他更复杂的图形,是因为三角形的简单性。
空间中,三点定义一个平面,4个或多于4个点就不一定了,而两个点不够定义平面,只能定义线段,所以3是最完美的数字,三角形万岁
线框渲染虽然很酷,但 3D 图像需要填充。
填充图形的经典算法叫 “扫描线渲染” 于 1967年诞生在犹他州大学。
这样填充的三角形比较丑,边缘满是锯齿,当像素较小时,就不那么明显。
一种减轻锯齿的方法叫 抗锯齿
与其每个像素都涂成一样的颜色,可以判断多边形切过像素的程度,来调整颜色,如果像素在多边形内部,就直接涂颜色,如果多边形划过像素,颜色就浅一些。
这种边缘羽化的效果,看着更舒服些,抗锯齿 被广泛使用,比如字体和图标。
你如果放到浏览器里面的网页,可以看到字体是 抗锯齿 的,超平滑,在 3D 场景中,多边形到处都是,但只有一部分能看见,因为其他的被挡住了。 这叫 遮挡 最直接的处理方法是用 排序算法,从远到近排列,然后从远到近渲染。
这叫 画家算法 因为画家也是先画背景,然后再画更近的东西。
还有一种方法叫 深度缓存
它和之前的算法做的事情一样,但方法不同。
它记录场景中每个像素和摄像机的距离,在内存里存一个数字矩阵。
背面剔除
三角形有两面,正面和背面,游戏角色的头部或地面,只能看到朝外的一面,所以为了节省处理时间,会忽略多边形背面,减了一半多边形面数,这很好,但有个 bug 是如果进入模型内部往外看,头部和地面会消失。
明暗处理(灯光)
因为 3D 场景中,物体表面应该有明暗变化。
纹理
纹理在图形学中指外观,而不是手感,就像照明算法一样,纹理也有多种算法,来做各种花哨效果。最简单的是 纹理映射
CPU不是为此设计的,因此图形运算不快,计算机工程师为图形做了专门的处理器
叫 GPU “图形处理单元”, GPU 在显卡上,周围有专用的 RAM,所有的网格和纹理都在里面,让 GPU 的多个核心可以高速访问。