GrabPass
1:使用抓屏通道,GrabPass 1) 或 GrabPass{“纹理名称n;GrabTexture方问
2:后续的Pass通道使用这个抓屏:
3:编写案例
(1):创建一个顶点片元着色器:
(2):将这个着色器放到overlav队列
(3):使用GrabPass通道截屏,并定义好变量来接收
(4):设置顶点的Uv坐标;
(5):着色使用截图的纹理
在Tags中添加 渲染队列 ,保证该物体最后在绘制
然后添加Grabpass{} 截屏通道 默认使用 _GrabTexture
在顶点处理阶段,纹理采样要注意定义两个变量,一个是纹理接收变量,一个是该函数所必须的_ST 结尾的树,
// 截屏纹理采样
sampler2D _GrabTexture;
float4 _GrabTexture_ST;
等纹理寻址完成后,在进行着色,根据纹理uv颜色赋值即可。
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
//o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = TRANSFORM_TEX(v.uv, _GrabTexture);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_GrabTexture, i.uv);
return col;
}
shader代码:
Shader "GFStudy/GrabPassShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Overlay"} // "Queue"="Overlay"这里保证该物体 在最后在绘制
LOD 100
// 添加 Grabpass 截屏通道 _GrabTexture
Grabpass{}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
// 截屏纹理采样
sampler2D _GrabTexture;
float4 _GrabTexture_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
//o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = TRANSFORM_TEX(v.uv, _GrabTexture);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_GrabTexture, i.uv);
return col;
}
ENDCG
}
}
}
Unity中常用的cginc
该目录存放在Unity安装目录下:Unity\Editor\Data\CGIncludes
1:cginc文件:宏,帮助函数等,放在CGincludes下面,开发人员可以开发自己的cginclude文件
2:常用的cginc文件:
HLSL.Support.cginc 协助多平台开发的一些宏等,自动包含
UnityShaderVarirables.cginc 全局变量,自动包含:
UnityCG.cginc 常用的帮助函数:
AutoLight.cginc 光照和阴影功能;
Lighting.cginc 表面着色器的光照模型:
TerrainEngine.cginc 地形植被的光照着色函数;
UnityCG.gcinc常用函数
1:UnityworldSpaceviewDir:给定对象空间的顶点位置朝向摄像机方向的世界坐标空间方向;
2:0bjspaceviewoir:给定对象空间的项点位置 朝向摄像机方向的对象空间方向;
3:Parallaxoffset: 计算用于视差法线贴图的Uv偏移量
4:Luminance:将颜色转为亮度;
5:DecodeLightmap:从光照贴图中解码颜色:
6: float EncodeFloatRGBA(float4 rgba):将RGBA颜色编码为 10,1)的浮点数;
7:float4 Decode FloatRGBA(float v):将一个浮点数解码为RGBA的颜色;
8:UnityworldspaceLightDir 给定对 象空间的顶点位置到光源的世界坐标空间方向;
9:0bjspacelightDir:给定对象空间的顶点位置到光源的对象空间方向;
UsePass 复用
1:编写过的pass可以重复使用,借助UsePass "ShaderPath/PASS_NAME”
2:PASS名字要大写:
3: Pass {
name "ONE" // neame 也不能写在 CG代码块中
}
4.UsePass "Custom/ShaderName/ONE"
shader示例:
Shader "GFStudy/GrabPassShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque"}
LOD 100
Pass
{
name "ONE"
CGPROGRAM
// cg代码块
ENDCG
}
}
}
// 复用Pass时写法:
UsePass"GFStudy/GrabPassShader/ONE"
移动平台优化
1:代码优化:预先计算好对应的值 比如sqrt(2)->根号2->1.414.
放心的使用向量相关操作,叉积,点积,基本都是硬件实现,很高效;
尽量减少函数调用减少开销;
2:尽可能的计算放在项点(vert)着色器中,项点着色器的调用顿率远低于片(frag)着色器:
"3:几何复杂度考量:在10s平台视口内的顶点数不要超过100k个,10s默认的缓冲区就是就是
这么大,超过这个数字,底层会做一些操作消耗更多的资源:
4纹理大小为 2^p次方大小,16,64,128,256, 512, 1024;
5:使用适当的数据类型门oat < half < fixed;
6:尽量慎用透明效果 透明效果GPU要逐像素渲染;