☀️博客主页:CSDN博客主页
💨本文由 萌萌的小木屋 原创,首发于 CSDN💢
🔥学习专栏推荐:面试汇总
❗️游戏框架专栏推荐:游戏实用框架专栏
⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正
📆 未来很长,值得我们全力奔赴更美好的生活✨
------------------❤️分割线❤️-------------------------
Unity 小科普
老规矩,先介绍一下Unity的科普小知识:
Unity 是行业领先的实时3D开发平台。
包括游戏开发,电影,AR/VR,虚拟现实在内的所有创作者,可以将梦想照进现实。
Unity提供了一套完整完善的软件解决方案,可用于创作,运营和模拟任何2D和3D的内容,进本全平台支持。
实际上Unity就是一个游戏引擎,大名鼎鼎的原神就是用它制作的。
顶点着色器
- 输入进来的每个顶点都会调用一次顶点着色器,不可以创建或者销毁任何顶点,而且无法获得顶点与顶点之间的关系
- 完成坐标变换,逐顶点光照,输出后续阶段所需要的数据
最基础的任务
- 把顶点坐标从模型空间转换到齐次裁剪空间
裁剪
一个图元和摄像机视野的关系由3种
- 完全在视野内,部分在视野内,完全在视野外
屏幕映射
- 屏幕映射不会对输入的z坐标做任何操作
- 屏幕坐标系和z坐标一起构成一个坐标系,叫做窗口坐标系,一起传递到光栅化阶段
- OpenGL把屏幕左下角当成最小窗口坐标值,DirectX则是左上角最小值
三角形设置
- 上个阶段得到三角形每条边的两个端点,需要得到三角网格对像素的覆盖情况,必须计算每条边上的像素坐标,该过程叫做三角形设置
三角形遍历
- 检查每个像素是否被三角网格覆盖,如果有,就生成一个片元,也叫扫描变换
- 这一步输出是一个片元序列
- 一个片元不是真正意义上得像素,包含了很多状态得集合,包括但不限于屏幕坐标,深度信息,伐先,纹理坐标
片元着色器
- 可编程着色器阶段
- 前面得光栅化阶段实际上并不会影响屏幕上每个像素得颜色值,而是会产生一系列得数据信息,用来表述一个三角网格是怎样覆盖每个像素得,每个片元就负责存储这样得一系列数据。
- 输入是上个阶段对顶点信息插值得到得结果
- 输出是一个或者多个颜色值
- 可以完成纹理采样
- 局限在于,仅可影响单个片元,当执行片元着色器时,它不可以将自己得任何结果直接发送给邻居,但是片元着色器可以访问到导数信息
逐片元操作
- DirectX中这一阶段被称为输出合并阶段
- 决定每个片元得可见性,涉及很多测试工作,如深度测试,模板测试
- 如果一个一个片元通过了所有的测试,就需要把这个片元得颜色值和已经存储在颜色缓冲区中得颜色进行合并,或者混合
- 该阶段高度可配置性
模板测试
- GPU首先读取(使用读取掩码)模板缓冲区中改片元位置得模板值,然后将该值和读取得模板值进行比较,比较函数可以由开发者指定,不论片元有没有通过测试,我们都可以根据模板测试和下面得深度测试结果来修改该模板缓冲区
深度测试
- 通过模板测试之后进行深度测试
- 可高度配置
- 比较该片元深度值和深度缓冲区中得深度值,该函数也是由开发者设置得
和模板测试不同得是,如果该片元没有通过测试,就没有权力修改缓冲区中的值,如果通过了,开发者可以指定是否要用这个片元的深度值覆盖掉原来的 - 对于不透明物体,开发者可以关闭混合操作,这样片元着色器计算得到的颜色值就会直接覆盖颜色缓冲区中的像素值,但对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的