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入门精要》