第5篇 Shader的组织和优化 - Unity 3D ShaderLab开发实践
chapter 30 shader的组织和复用
1 通过cginc文件实现复用,可以定制自己的cginc文件,然后通过#include包含进来,实现shader代码的复用。
2 可以通过UsePass实现复用:
Shader "Test" {
SubShader {
UsePass "Test/My"
}
}
3 定义自己的Shader关键字,运行时更改关键字改变shader行为
shader代码如下:
脚本中的代码如下:
chapter 31 必须知道的渲染概念
- 逐点计算:在vertex函数中进行的计算就叫做逐点计算;
- 逐像素计算:在fragment函数中进行的计算叫做逐像素计算,和物体在屏幕上的大小相关;是shader的计算和渲染优化的重点;
- 上述两个方法选择:尽量把计算移动到vertex函数中;
- draw call:CPU为GPU准备渲染数据,并指令GPU进行一次渲染的操作(是重量级的);一个Draw Call的消耗还要具体看Draw Call的内容;
- Batching的概念和Unity为优化DrawCall所做的工作:通过把数个或数百个简单的、共用同一材质的物体合并为一个mesh。Unity Draw call batching小结_图形学和游戏开发小学生-CSDN博客
- 利用渲染队列,后渲染的物体尽量有更多的范围被遮挡;
chapter 32 基于渲染路径的优化
一定不要在ForwardAdd中计算除了_WorldSpaceLightPos0之外的任何光源,这是非常耗时的事情。
针对Deferred渲染路径,它必然是逐像素进行的。
chapter 33 移动平台上的优化
对于tex2D/texCUBE指令,在移动平台上,一个读取贴图的指令和一个普通的数学运算指令消耗大概相差至少一个数量级;在PC平台,这个差别更大,大概在两个数量级以上。
对于mipmaps的选项,如果游戏是3D,一定要打开mipmaps选项。慎用后期效果,慎用透明效果。