本篇记录的杂乱,想写一点东西但又感觉没什么可写,就把两个内容简要放到一起了
(一)多相机相关
(1)UI相机使用Gamma工作, 场景相机使用Linear工作:
Gamma下的混合:
Linear下的混合: (2)分离相机分辨率 和 FrameBuffer, 可以手动设置相机分辨率
场景使用缩放后的分辨率,UI使用正常的分辨率
多相机的应用
(2)
这里重点说明 DepthOnly:
Depth 这里指的是相机的深度:(实际就是只清除深度)
这时我希望,球能无论什么情况都要被渲染出来,这时就Depth only就可以了,这里深度指的摄像机深度。首先给球和立方体建立不同Layer,然后我们再新建一个摄像机,选择Depth only。摄像机Depth数值大于刚刚主摄像机,设置Culling Mask单 单是球的layer。这样球就会出现在立方体的前面。这就是Depth only的功能了。再看小效果如下图:
(3)Dont Clear: 不清空任何数据,在上一帧的基础上继续绘制:
(4)相机的 渲染对象 和 对象阴影分离: 可以在不渲染对象的情况下,单独渲染对象的阴影
自定义管线就是控制力强的一批
将相机结果应用到RenderTexture, renderTexture 设置到UI上的混合模式,
由原来的 SrcAlpha OneMinusSrcAlpha, 公式:最终颜色 = 源颜色 * 源透明值 + 目标颜色*(1 - 源透明值)
改为 One OneMinusSrcAlpha 公式:最终颜色 = 源颜色 + 目标颜色*(1 - 源透明值)
说到相机间混合: 想到了直接把 场景相机在Linear空间, UI相机在Gamma空间 两个 不同的处理方式来混合,下次再说吧
(二)自定义粒子shader:
(1) 实现 用自定义参数控制实现效果 参数作用于随着粒子的生命周期
所以在上面的初始化Input的过程:
struct Attributes
{
// 顶点色
float4 color : COLOR;
#if defined(_FLIPBOOK_BLENDING)
float4 baseUV : Texcoord0;
float4 flipbookBlend : Texcoord1;
//float3 custom1 = Texcoord1.yzw;
#else
float2 baseUV : Texcoord0;
#endif
float3 positionOS : POSITION;
// 通过顶点数据 提供该渲染对象的索引
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
#if defined(_VERTEX_COLORS)
float4 color : VAR_COLOR;
#endif
#if defined(_FLIPBOOK_BLENDING)
float3 flipbookUVB : VAR_FLIPBOOK;
float3 custom1 : VAR_CUSTOM;
#endif
float4 positionCS : SV_POSITION;
float2 baseUV : VAR_BASE_UV;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
Varyings UnlitPassVertex(Attributes input)
{
Varyings output;
// 提取渲染对象的索引,并且存储到其它实例宏 所依赖的全局静态变量中
UNITY_SETUP_INSTANCE_ID(input);
// 将索引 转换存储,在片元中还要适用
UNITY_TRANSFER_INSTANCE_ID(input,output);
float3 positionWS = TransformObjectToWorld(input.positionOS);
output.positionCS = TransformWorldToHClip(positionWS);
output.baseUV = TransformBaseUV(input.baseUV.xy);
#if defined(_FLIPBOOK_BLENDING)
output.flipbookUVB.xy = TransformBaseUV(input.baseUV.zw);
output.flipbookUVB.z = input.flipbookBlend.x;
output.custom1 = input.flipbookBlend.yzw;
#endif
#if defined(_VERTEX_COLORS)
output.color = input.color;
#endif
return output;
}
这样就把 custom1的变量,传输到fragment中
更重要的是 : custom1的值 是可以随着粒子的生命周期变化!!!
取决于你传入什么样的格式:
这样就可以丰富粒子的变化形式了
参考阅读