图形学之Unity渲染管线流程

2022年01月14日 阅读数:1
这篇文章主要向大家介绍图形学之Unity渲染管线流程,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Unity中的渲染管线流程

下图是《Unity Shader 入门精要》一书中的渲染流程图;缓存

在这里插入图片描述

ApplicationStage阶段:准备场景信息(视景体,摄像机参数)、粗粒度剔除、定义每一个模型的渲染命令(材质,shader)——由开发者定义,不作讨论;性能

GemetryStage阶段:顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射;图片

RasterizerStage阶段:三角形设置遍历,片元着色器、逐片元操做;开发

每一个阶段具体操做以下图(虚线框是可选阶段):渲染管线get

模型空间——矩阵变换——齐次裁剪空间——透视除法——NDC标准设备坐标——屏幕映射it

齐次裁剪空间是视景体空间(台体);io

CVV:标准视体-也就是NDC坐标系对应的空间;入门

透视除法:顶点坐标除以w份量,将当前z深度所在的截面缩放为(2,2,2)的截面坐标;因此w份量记录了z深度信息;ast

硬件作透视除法得到NDC归一化设备坐标——再通过屏幕映射得到屏幕坐标系下顶点坐标;渲染

Unity使用OpenGL的NDC,z份量在[-1,1];

OpenGL和DirectX差别

NDC空间——OpenGL为[-1,1],DirectX为[0,1],深度z范围不一样;

窗口坐标系——DirectX左上角原点,OpenGL左下角原点;

投影平面——DirectX投影平面就是视景体近截面,OpenGL有视平面;

左右手坐标系——DirectX左手,OpenGL右手,叉乘顺序;

问题:

为何片元不叫像素?

片元是不少状态的集合,记录了该像素的屏幕坐标,深度信息,法线,UV等;

DrawCall为何会影响性能?

DrawCall是CPU向GPU添加渲染命令的过程,过程会由CPU向GPU发送数据(模型信息),DrawCall的次数越多CPU消耗性能就越大,DrawCall次数过多会致使每一帧CPU来不及发送所有数据给GPU渲染;

GPU有一个命令缓存区(Command Buffer),CPU的渲染命令都会存储在这里,GPU从命令缓存区依次执行渲染命令;

两种渲染命令:渲染模型(CPU提交模型信息也就是DrawCall)和改变渲染状态(着色器纹理状态改变,更耗时);

通常状况都是GPU渲染完成等待CPU发渲染命令;