基础理论_渲染管线

前言:博学静思才能成长,笔记是记录笔者自己的学习路程。

 

01:渲染(rendering)是什么?

 

渲染是以软件由模型生成图像的过程。模型是用语言或数据结构进行严格定义的三维物体或

 

虚拟场景的描述。

 

渲染用于描述:计算视频编辑软件中的效果,以生成最终视频的输出过程

 

02:渲染的类别:离线渲染(电影) 实时渲染(游戏) {本文不做对于离线渲染的描述}

 

实时渲染的要求是:需要我们一秒钟完成24帧以上的图像的渲染。(不卡顿)性能表现尤为重要

 

一秒钟完成60帧以上(流畅),因此需要我们进行优化手段加速渲染,达到理想要求

 

03:渲染管线是什么?

 

完成渲染操作的一道流水线。也就是完成渲染的一套流程。一般而言就是把模型数据,贴图资源种种文件给与渲染管线,通过渲染管线最终生成我们想要的画面。(其中明显涉及到了3d到2d的转化)

 

04:unity内置渲染管线(unity build-in rendering pipeline)的讲解

 

广义的渲染管线有两部分,一个是cpu端的渲染逻辑,一个是gpu端的渲染管线。口头的渲染管线大都是gpu端的渲染管线,但实际上cpu端的渲染逻辑也是一个十分重要的内容。

 

cpu端的渲染逻辑工作:1.剔除:进行视椎体剔除,遮挡剔除,根据层级等规则

 

2.渲染顺序:按照距离,渲染队列等规则

 

3:打包数据:比如顶点数据,材质数据等等

 

4:调用shader:setpasscall以及drawcall

 

cpu端的任务也被称为应用阶段(unityshader入门精要),身为开发者的三大任务:提交场景数据其中包括摄像机的位置,模型,光源等等,再进行粗粒度剔除(culling)目的在于把不需要处理的数据进行筛选,防止移交到了几何阶段。最后就是确立渲染状态这也是最为重要的一点,比如用那些shader,什么材质,什么纹理等等。

 

几何阶段(gpu内)的目的是决定渲染的图元,怎样绘制,在哪里绘制,同时进行逐顶点,逐多边形的操作。

 

应用阶段的产物:就是渲染图元(点,线,三面角)

 

而几何阶段就是将顶点的三维坐标(包括对应的深度值,着色等信息)通过屏幕空间的光栅器转化到输出空间的二维坐标(保留那些信息)。

 

gpu端的渲染管线工作:使用信息产生像素,并渲染出最终的图像(这是一个很多的过程如下我们进行说明)

 

接收到了cpu的drawcall后,显卡的gpu从cpu获得了几何阶段的信息后知道了我可以开始工作了。注意drawcall命令仅仅指向是需要被渲染的图元列表,而不会包含任何一个材质信息。

 

gpu根据渲染状态,所有输入的顶点数据进行计算得到像素,也就是顶点数据(应用阶段得到的图元)先由顶点shader(vertex shader)将顶点坐标从模型空间变化到裁剪空间,通俗的理解也就是拍照,拍照实则也是一个三维到二维的过程,注意的是顶点shader并不会产生2d的图像,仅使得场景中的3D对象产生变形效果。变形后自然要进行着色细分,便会到曲面细分着色器(tesselltry shader)将图元细分方便于着色,此时处于裁剪空间,需要到屏幕上,要进行一个裁剪,得到我们想要的一个画面范围,再进行屏幕映射。要分清楚剔除和裁剪。裁剪是裁剪出我们视野之外的物体,并剔除某些三角图元的面片。屏幕映射做的工作是一个图元坐标系到屏幕坐标系的过程。此时才算几何阶段结束了。

 

那么开始光栅化:光栅化的过程是通过三角形设置,三角形遍历,此时就可以着色了,用片元着色器(fragment shader)进行片元的着色,其中还有一个逐片元着色(per-fragment operations)进行颜色的一些修改,深度缓冲以及混合

 

最后到了逐片元操作:要进行模板测试,深度测试(用于渲染阴影,轮廓渲染),再进行混合(不透明物体。混合要关闭,透明物体混合要开启)最终得到屏幕的图像。

 

(作为渲染管线基础的解释,后续会做出更多深层次的说明,同时包括数学原理,纹理采样等等)

上一篇:glsl include 简单实现(正确定位错误文件)


下一篇:Timeline技能编辑器如何提取关键帧信息