矩阵
概念
矩阵本质就是一个n*n 的数据,它可以在Unity中可以帮助GameObject进行平移、旋转和缩放。同样在渲染中它最大的作用是可以变换坐标空间。
矩阵在 Shader 中的实际应用
在Unity渲染中,不管是光线计算、顶点计算、像素计算、法线计算,所有的计算有一个公共的规则,就是需要在同一个坐标空间下计算(通常是在世界坐标或者视图空间)
渲染流程
当 GPU 处理顶点时,需要将模型坐标系下的点转换到屏幕空间,步骤是:
模型空间 -> 世界空间 -> 相机空间 -> 裁剪空间 -> 屏幕空间
每次的空间转换都是通过矩阵来计算的。
底层逻辑
接下来,我们了解下在Unity中模型空间坐标到底是如何转换到世界空间坐标的。
首先我们要弄清一些我们已知的信息
- 模型空间每个顶点的坐标位置
- Unity编辑器中模型的Transform数据,包括position , rotation , scale
- 相机的Transform数据,包括 position , rotation
- 相机信息,包括Field of View,Aspect,Near,Far等
然后我们要弄清楚我们需要什么信息
- 世界空间每个顶点坐标信息
- 相机空间每个顶点坐标信息
- 裁剪空间每个顶点坐标信息
最后我们就是要弄清楚我们怎么样得到需要的信息
- 模型的Transform数据可以得到TRS矩阵,通过矩阵跟模型空间坐标计算得到世界空间的坐标信息
- 相机的Transform数据可以得到Camera TR矩阵,(注意下,相机的scarl缩放数据是无用的,不参与矩阵变换计算),同理通过Camera TR矩阵计算得到相机空间坐标信息
- 至于得到裁剪空间坐标位置就是完全由Unity编辑器完成,它会通过Field of View,Aspect,Near,Far相机信息,从3D压缩到2D空间中,最终得到了我们裁剪空间坐标信息
裁剪空间 -> 屏幕空间
一开始,我混淆了这两个空间,以为裁剪空间就是屏幕空间,但其实裁剪空间就是Shader代码中的SV_Position 语义下数据信息。
那么从裁剪空间到屏幕空间Unity到底做了哪些操作呢
- NDC(标准化设备坐标)
- 绘制像素颜色值
- 深度测试,检测物体有没有被覆盖
- 生成片元,计算插值参数
NDC(标准化设备坐标)
概念:裁剪空间到屏幕空间中比较重要的一步,它的作用是
- 给裁剪空间的坐标信息进行归一化,统一成标准立方体
- 可以实现近大远小效果,根据距离来实现
- 能正确计算插值参数
总结
以上就是Unity渲染空间变换中每一步具体底层实现的逻辑步骤,希望对大家能有所帮助