Unity Shader:(一)渲染流水线

一个分享着色器的网站https://www.shadertoy.com/

什么是Shader? GPU流水线上一些可高度编程的阶段。

 

 

一、渲染流水线(概念上)

应用阶段  ----输--出--渲--染--图--元---->   几何阶段   -------输--出--屏--幕--空--间--顶--点--信--息--->   光栅化阶段

准备场景数据                          把顶点坐标变换到屏幕空间中                                      对上一阶段顶点数据进行插值,再逐像素处理

粒度剔除culling                                        GPU上运行                                            决定每个渲染图元中的哪些像素应该被绘制在屏幕上

设置渲染状态                                                                                                                                         GPU上运行

CPU上运行

<-------------应用阶段:CPU和GPU之间的通信------------>

1. 把数据加载到显存中

2. 设置渲染状态

3. 调用DrawCall

    DrawCall是一个Cpu发起的发向GPU的命令。这个命令会指向本次调用需要渲染的图元列表。

    为什么DrawCall多了会影响帧率?渲染速度往往快于CPU提交命令的速度,DrawCall数量太多,会把大量时间花费在提交DrawCall上。

    那么如何减少DrawCall?批处理,静态物体只合并一次。(避免使用大量很小的网格。避免使用过多的材质。)

二、GPU流水线(实际上)

----------------------------------------几----何----阶----段-------------------------------------------

-------    顶点着色器 -> 曲面细分着色器 -> 几何着色器 -> 裁剪 -> 屏幕映射    -------

------------------------------------------------------------------------------------------------------------

1. 流水线第一阶段:顶点着色器 Vertex Shader  完全可编程

主要工作:坐标变换、逐顶点光照

坐标变换:把顶点坐标从模型空间转换到齐次剪裁空间。例如 

o.pos = mul ( UNITY_MVP, v.position );

2. 裁剪:不在摄像机视野的顶点裁减掉。可配置但不可编程。

3. 屏幕映射:把每个图元的坐标转换到屏幕坐标系。不可配置不可编程。

------------------------------------光----栅----化----阶----段-----------------------------------------

----------    三角形设置  -->  三角形遍历  -->  片元着色器  -->   逐片元操作    ---------

------------------------------------------------------------------------------------------------------------

1. 片元着色器 Fragment Shader  完全可编程

主要工作:逐片元的着色操作。

2. 逐片元操作  执行修改颜色、深度缓冲、进行混合等等重要操作。可配置但不可编程。

 

-------------------------------------------------------------------------------------------------------------------------------------------------------

内容参考《UnitySahder入门精要》

posted @ 2022-02-10 14:10  番茄玛丽  阅读(62)  评论(0编辑  收藏  举报