渲染流水线 相关知识总结

本文详细介绍了图形渲染的流程,包括CPU在应用阶段设置场景数据、进行剔除优化,GPU处理几何变换、投影、裁切和屏幕映射。光栅化阶段计算图元覆盖的像素,逐片元操作涉及着色、测试和混合。文章还讨论了空间变换、剔除与裁切的区别以及渲染优化策略如DrawCall的调用。
摘要由CSDN通过智能技术生成

流水线的这种东西,其阶段划分每个人,每个教程都有不同的理解,这篇会结合我看过的几篇文章,写我自己的流程划分

抽象理解渲染过程


总的流程更像是这样:CPU布置工作、准备材料并下达命令(应用阶段),GPU只负责计算(GPU流水线)
在这里插入图片描述

  • 应用阶段
    1.布置场景数据(场景 物体 光源 摄像机等),决定摄像头中有哪些内容需要渲染
    2.传递渲染状态:即设置各个物体的参数,材质,shader等
    3.粗粒度剔除(culling):剔除摄像机外的内容,优化性能
    4.将几何信息传递给几何阶段
    5.发令 drawcall
  • 几何阶段
    1 几何着色器:进行MVP变换
    2 可选着色器:网格顶点的增加
    3 投影变换 projection:透视除法
    4 裁切 Cliping:优化性能
    5 屏幕映射 ScreenMapping:适应不同屏幕
  • 光栅化阶段:
    总的来说就是计算每个图元覆盖了哪些像素
    1.三角形设置
    2.三角形遍历
  • 逐片元操作:
    1.片元着色
    2.测试&颜色混合
    3.目标缓冲区



详细介绍各个渲染步骤

1. 应用阶段


1.1设置场景数据

一般就是地编,布置物体,设置灯光,设置摄像机

1.2 Culling 粗粒度剔除

粗粒度剔除:包含视锥体剔除(Frustum Culling)和遮挡剔除( Occlusion Culling),减少无用的计算,优化性能(这实际上是帮助后面的MVP变换和clip提前减轻负担,是引擎对于渲染的优化)
请注意:应用阶段的剔除操作是以物体为对象的

  • 视锥体剔除 (Frustum Culling) 禁用相机视野外的对象渲染,不禁用视野中被遮挡的任何物体的渲染(剔除在视锥体外的物体运算量较低,初步剔除)

  • 遮挡剔除:遮挡剔除 (Occlusion Culling) 功能是在对象因被其他物体完全遮挡,当前在相机中无法看到时,禁用对象渲染。该功能一般不会在三维计算机图形中自动开启,因为在透明物体渲染中会出错

(更进一步的,一些光源对象也可以剔除,如与视锥体不相交的聚光,距离非常远的点光源)

1.3 渲染设置

  • 材质参数设置:用哪些贴图,属性参数怎样设置
  • 着色器设置:决定使用哪个shader,或者决定使用GPU instance批处理一些对象(没有使用过Unity中的批处理,具体操作还需要理解)
  • 渲染顺序:决定使用哪种排序来渲染对象,Unity一般就是Render Queue,有些特殊的情况可以自定义,如按照与摄像机距离顺序,特殊的顺序可以在特殊情况下优化性能。
  • 渲染目标:RenderBuffer 或 RenderTexture,有时需要同时输出,如SSSSS的皮肤渲染
  • 设置渲染模式:forwardBase前向渲染,延迟渲染等

1.4 传递几何信息

将准备好的场景信息存入显存(我不确定是整个场景的数据还是当前剔除后的数据,需要进一步查证,如果是剔除后的数据,那显存岂不是每一帧都要来回的写入?)

  • 几何信息:位置、法线、uv坐标、(颜色)发送给几何着色器 (注意这些信息全部是模型空间的信息!
    (有一个问题,几何信息是以物体/图元为单位的,还是没单位,所有顶点全视为单个顶点,后续再组装起来?)(思考3min后的解答:当然是以对象为单位的,渲染是以对象为单位的啊,一个对象渲染完成后,下一个对象还会进行几何阶段,顶点自然也就分开了)
  • MVP矩阵信息(M矩阵就是这个物体在世界中的位置了)
  • 贴图(先存入显存,后续再由纹理坐标读取?)

1.5 调用DrawCall

当一切都准备好之后,发送最后一句drawcall命令
drawcall由CPU发起,GPU接收执行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值