-
Notifications
You must be signed in to change notification settings - Fork 89
Shader
woctordho edited this page Nov 13, 2021
·
9 revisions
Nova的转场(trans、trans2)和特效(vfx)是通过动态创建带有相应shader的material,添加到sprite或者摄像机上来实现的。
-
_MainTex:要显示的图像本身- 对于第一类转场(
trans),_MainTex是转场后的图像
- 对于第一类转场(
-
_SubTex:用于第一类转场,转场前的图像- 把第一类转场应用到摄像机时,先把转场前摄像机拍下的图像截图,设为
_SubTex,再把场景设置成转场后的状态,_MainTex就是此时摄像机拍下的图像
- 把第一类转场应用到摄像机时,先把转场前摄像机拍下的图像截图,设为
-
_SubColor:用于第一类转场,转场前的颜色(转场后的颜色由frag中的i.color输入) -
_T:控制特效的显示程度,0为完全不显示,1为完全显示- 对于第一类转场,
_T从1变到0,_T = 1时显示_SubTex,_T = 0时显示_MainTex - 对于第二类转场,先把
_T从0变到1,再把_MainTex换成转场后的图像,再把_T从1变到0 -
vfx动画一般只需要控制_T,如果需要分别控制各个property,可以用vfx_free
- 对于第一类转场,
我们需要把每个shader复制成多个变种(variant),并且比Unity提供的shader variant更加灵活。因此我们先给每个shader编写一个模板,称为shader proto,然后用Tools/Resources/generate_shaders.py生成正式的shader文件。
Shader proto放在Assets/Nova/ShaderProtos/文件夹下,生成的shader放在Assets/Nova/Resources/Shaders/文件夹下。
generate_shaders.py同时会parse所有shader的property,保存到Assets/Nova/Sources/Generate/ShaderInfoDatabase.cs和Assets/Nova/Lua/shader_info.lua,用于在C#和Lua代码中读取这些metadata。
Shader variant有如下几种:
- Default:用于sprite,普通的shader,与背景按照alpha混合
- Multiply:用于sprite,使背景变暗
- Screen:用于sprite,使背景变亮
- PP:用于摄像机的post processing stack,没有需要混合的背景,会根据窗口缩放调整模糊半径等参数
如果shader proto的第一行是VARIANTS: 某些variant,用英文逗号分隔(比如ShowSecondTexture.shaderproto),则只会生成那些variant,否则默认生成所有variant。
Shader proto中还有一些关键词会被替换,实现详见generate_shaders.py:
-
$VARIANT_NAME$:Unity的shader名称中的variant部分 -
$VARIANT_TAGS$:variant对应的混合模式 -
$VARIANT_RGB$:对于Multiply和Screen,在输出颜色之前把alpha应用到RGB通道 -
$DEF_GSCALE$:对于PP,定义一个变量_GScale,GameRenderManager.cs会将它设为窗口的缩放倍数 -
$GSCALE$:对于PP,调用_GScale,用于根据窗口缩放调整模糊半径等参数- 对于其他variant,替换为1.0