(十五)计算机图形学 之 GrabPass截屏、Shader组织优化

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要逐像素渲染;

猜你喜欢

转载自blog.csdn.net/u013774978/article/details/130277444