注:是b站霜狼_may的视频为纲学习,参考毛星云的Real-Time Rendering 3rd 的总结和games101
数据通过渲染管线变成画面,在这个管线中所有环节环环相扣,上一个的输出是下一个的输入。分为以下几步
主要任务就是将需要显示的东西都准备好,主要是CPU处理。这个是图像渲染管线上的第一个阶段,这段是完全软件实现的,所以可以完全控制。 准备场景数据:场景,数据,光源 加速算法,粗粒度剔除:裁剪看不到的光源和物体 设置渲染状态和参数:绘制设置,绘制顺序,渲染目标(输出到FrameBuffer或RenderTexture),渲染模式 调用drawcall,将数据发去显存
主要负责大部分多边形操作和顶点操作。 顶点着色:可编程 可选点处理:曲面细分,几何着色器(两者都是可选的) 投影:这个由GPU自动完成(顶点空间->投影空间完成) 裁剪:视锥体裁剪(CVV),背面剔除(可配置) 屏幕映射:屏幕映射主要目的就是找到屏幕上对应的坐标
顶点着色器中最重要的是MVP矩阵,这块儿比较复杂,games101讲的很好,之后总结下
曲面细分:可选步骤,通过一定的算法从一些顶点生成更多的顶点
几何着色器:通过给定的图元生成更多的图元。
投影:从3D空间转到2D空间的转换。一般分为正交投影和透视投影,这块儿之后根据games101补充
裁剪:处于裁剪空间以外的图形不显示,部分处于裁剪空间以外的图形会新增两个顶点,把超出部分裁掉
屏幕映射:裁剪后给出的是标准设备坐标系,这里需要映射到屏幕坐标系
主要为三角形设置和三角形遍历两个步骤,也有些会把像素着色器,片元着色器和混合颜色也算到光栅化阶段中
三角形设置:基于屏幕映射的结果,可以知道顶点像素的位置,计算三角形边界的过程就是三角形设置
三角形遍历:寻找所有被三角形覆盖的像素,这块儿有很多细节,例如如何判断三角形覆盖像素,如果判断的逻辑不够好会出现部分像素在画面中抖动等。
抗锯齿(MSAA):对每个像素中间判定是否被三角形覆盖的判定点增加(详细资料)
主要分为三个步骤:片元着色,颜色混合,输出到目标缓冲区。
片元着色:通过三个顶点的颜色线性插值得到内容颜色(就是那个经典的三点是红绿蓝的三角形)
颜色混合-透明度测试:透明度小于阈值的片元就不渲染,这个部分说实话虽然知道这个步骤如何,但是没明白为啥要这么做,在实际场景中的应用。
颜色混合-深度/模板测试:深度测试像是zbuffer的那个,这个我拿C++实现过,具体实现可以参考(之后再贴)模板测试:视频里没有说模板值代表着什么,这块儿不理解
输出缓冲:这里一句带过了,说明了这一步是可以配置的
混合:这里举得例子看上去像是解释了半透明如何被渲染
总结一个完整的渲染过程 1.准备一个模型 2.