如何用2D平面展现3D图形
2D图形
在一个平面中有了两个点,知道了他们的XY坐标,就能够把它们链接起来画成一条线
经过操控A和B点的XY坐标能够操控一条线
在3D图画中,点的坐标多了一个Z轴的坐标系
可是在2D的屏幕坐标上不可能有XYZ立体的坐标轴
所以需求图形算法负责把3D坐标“拍平”显现到2D屏幕上,这个叫做3D投影
将3D的点转化为2D的点之后,再用之前链接2D点的办法去衔接这些点,这个叫做线框烘托
投射的灵感:两种投影办法
推荐文章:
zhuanlan.zhihu.com/p/473031788
总的来说便是把一个3D图形移动到2D的坐标系上,中心对应的坐标系的原点,然后就能够得到这个3D的2D坐标了
假如用光去找一个3D的物体的时分,用一个平面去展示投影,当滚动3D物体的时分,投影会看起来像3D物体,虽然投影面是平面。
电脑也是这样去做的将3D转成2D。首要屏幕便是一个2D的投影平面,依据投射的算法就能够将3D转成2D的坐标
正交投影
立方体的各个边在投影中互相平行,能够说使用数学将3D转化成了2D的坐标系
正交投影是一种平行投影,相似用一束平行光把物体的印象笔直地投射到地上上。
透视投射
透视投影能够产生近大远小的效果,就和人类调查国际的办法相似
在实在的3D国际中,平行线段会在远处收敛与一点
为什么杂乱图形的绘制要使用三角形
在3D图形学中,咱们叫三角形“多边形”
一堆多边形的调集叫做“网格”
网格越密,外表越光滑,细节越多
首要来讲为什么用三角形,而不是正方形
在一个空间中,三个点界说一个平面
假如给定3个3D点,就能画出一个平面。可是四个点就不必定了、
假如是两个点那么不够界说平面,只能够界说线段;假如是四个点那么可能界说的就不只仅只要一个平面了,所以3是个完美的数字
填充图形算法
扫面线烘托
线框烘托虽然很酷,可是3D图画需求填充
步骤:
- 先铺上一层像素网络
- 扫描线算法,先会去读取多边形的三个点,找出最大和最小的Y值,然后只在这两个点之间进行作业
- 然后算法从上往下,一次处理一行,核算每一行和多边形相交的两个点。扫描线算法会填满两个相交点之间的像素 由于是三角形,假如相交一条边,必然相交别的一条边
抗锯齿
这样的三角形比较丑,由于边缘满是锯齿
一种减轻锯齿的办法叫做抗锯齿
抗锯齿:与其每一个像素都涂成相同的像素,能够判别多边形切过像素的程度来调整色彩。
假如像素在多边形内部直接填充色彩;假如多边形划过像素,那么色彩就会浅一些
遮挡的烘托算法
在3D场景中有许多的多边形,可是只要一部分能看见,由于其他的被遮挡住了。
排序算法(画家算法)
最简单的处理办法
从远到近排列,从远到近烘托,这叫画家算法,由于画家也是先画背景再画更近的
东西
步骤
- 第一步,便是从远到近进行排序(A黄色,B蓝色,C绿色 三个三角形的间隔)
- 有序之后,使用扫描线算法进行填充多个多边形,一次填一个。(顺序是从远到近进行填色)
深度缓冲
这个算法和画家算法的思路相同,可是办法不相同
而且深度缓冲算法不需求进行排序,所以它的速度会更快
Z-buffering算法会记载场景中每个像素和摄像机的间隔,在内存里存一个数字矩阵
步骤
- 首要,每个像素的间隔被初始化为“无限大”,然后Z-buffering从列表里第一个多边形开始处理,也便是A
他和扫描线算法逻辑相同,可是他不是给像素进行填充色彩,而是吧多边形的间隔和Z-buffing里边的间隔进行对比,他总是记载更低的值
- Z缓冲区完成后,会和“扫描线”算法的改进高档版合作使用,不只能够勘测到线的交叉点还能够知道某像素是否在终究场景中可见。假如不可见,扫描线算法会跳过那个部分
可是会有一个问题,假如间隔相同的话,那么哪个画到上面?
多边形在内存中移来移去,拜访顺序会不断变化,所以哪一个花在上面,往往是不可预测的
3D游戏的一个优化:反面剔除
三角形有双面,正面和反面。
游戏人物的头部或地上,只能看到朝外的一面,所以为了节约处理时刻,会疏忽多边形的反面,减少了一般多边形面数。
可是也有个bug便是从模型外面看的话其实头部和地上会消失
3D场景明暗处理
在3D场景中,物体外表应该有明暗变化。
这次仍是拿茶壶来做实验,和之前的例子不相同。这非必须考虑的是多边形面临的方向,他们不平行与屏幕,而是面临不同方向。面临的方向叫做“外表法线“
用一个笔直与外表的小箭头来显现这个方向
加一个光源,由于不同多边形面临光源的角度不同,因此会导致箭头的方向和光源照亮的方向重叠越多,代表这个多边形越亮
纹路Textures
纹路在图形学中是指外观,而不是手感。
纹路也有多种算法
纹路映射
最简单的用法
之前咱们经过扫描线算法进行填充色彩时,能够看看内存中的纹路图画,决议填充该像素区域时用什么色彩
做到这点,需求将多边形坐标和纹路坐标进行对应
- 多边形坐标和纹路坐标进行对应
- 当决议填充当前像素选择什么色彩时,纹路算法进行查询纹路,从相应的区域取平均色彩,并填充到多边形
GPU:图形处理器
咱们能够为这种特定运算进行做专门的硬件来加快速度
其次,咱们能够吧3D场景分解成多个小部分,然后进行并行烘托,而不是按顺序烘托。
cpu不是为此规划的,因此图形运算不快,所以核算机工程师为图形做了专门的处理器,叫做GPU”图形处理单元”
GPU在显卡上,周围有专用的RAM,一切网格和纹路都在里边,让GPU的多个中心能够高速拜访
参阅链接
www.bilibili.com/video/av213…
本文正在参与「金石方案 . 瓜分6万现金大奖」