unity Shader 概念

一、unity默认提供四种UnityShader:Standard Surface Shader,Unlit Shader,Image Effect Shader以及Compute Shader

1、Standard Surface Shader:会产生一个包含了标准光照模型的表面着色器模板

2、Unlit Shader:会产生一个不包含光照(但包含雾效)的基本的顶点/片元着色器

3、Image Effect Shader:为我们实现各种屏幕后处理效果提供一个基本模板

4、Compute Shader:旨在利用GPU的并行性来进行一些与常规渲染流水线无关的计算

二、unityshader属性面板:

1、DefaultMaps:默认纹理(表面着色器和固定管线着色器,一下分析表面着色器)

2、show generated code:显示unity在背后为该表面着色器生成的顶点/片元着色器

3、Compile and show code:下拉查看unity shader针对不同图像编程接口最终编译成的shader代码

4、Render queue:渲染队列

5、Disable batching:是否关闭批处理

三、ShaderLab:unity shader是一种抽象,我们和这个抽象打交道的途径——ShaderLab

1、Properties:

shaderLab中Properties语句块定义了着色器所需的各种属性

Properties{
    Name("display name", PropertyType) = DefaultValue
    Name("display name", PropertyType) = DefaultValue
}

①Name:shader中访问的名字

②display name:材质面板显示名字

③PropertyType:属性类型

Ⅰ、除此之外,我们还需要为每个属性指定一个默认值

unity Shader 概念_第1张图片 常见属性类型

Ⅱ、为了在Shader中可以访问到这些属性,我们需要在CG代码片中定义和这些属性类型匹配的变量;也可在CG代码片中定义这些变量,此时,我们可以通过脚本向Shader传递这些属性。所以Properties只是为了让这些属性在面板可见

2、SubShader:每个UnityShader文件至少有一个SubShader,unity会选择第一个可以在目标平台运行的SubShader,都不支持就运行Fallback

SubShader语义块定义:

SubShader{
    //可选的
    [Tags]//标签
    //可选的
    [RenderSetup]状态
    Pass{
    }
    //Other Passes
}

①ShaderLab中常见的渲染状态设置选项:

unity Shader 概念_第2张图片

②标签结构和SubShader的标签块支持的标签类型(注意和pass支持标签块类型区分)

Tags{"TagName1"="Value1" "TagName2"="Value2"}

③Pass语义块

pass语义块包含如下语义:

Pass{
    [Name]
    [Tags]
    [RenderSetup]
    //Other code
}

Ⅰ、可以在Pass中定义该Pass的名称:Name "MyPassName",然后可以通过ShaderLab的YsePass命令来直接使用其他Unity Shader中的Pass:

Use Pass "MyShader/MYPASSNAME"//必须使用大写形式

Ⅱ、Pass可以设置渲染状态

Ⅲ、Pass可以设置标签(与UnityShader中设置的标签不同)

unity Shader 概念_第3张图片

3、Fallback:

语义:Fallback "name"或者Fallback Off

四、UnityShader的形式:

1、表面着色器:是Unity自己创造的一种着色器代码类型,它被定义在SubShader语义块中的CGPROGRAM和ENDCG之间,是由Unity提供的封装过的CG/HLSL。也是在顶点/片元着色器上层的一层抽象封装

eg:

Shader "Custom/Simple Surface Shader"{
    SubShader{
        Tags{"RenderType"="Opaque"}
        CGPROGRAM
        #pragma surface surf Lambert
        struct Input{
            float4 color:COLOR;
        };
        void surf(Input IN,Inout SurfaceOutput o){
            o.Albedo=1;
        }
        ENDCG
    }
    Fallback "Diffuse"
}

2、顶点/片元着色器:使用CG/HLSL语言编写的顶点/片元着色器,它更加复杂,但是更加灵活,它是写在Pass语义块内。从本质上来讲,现在Unity Shader只有顶点/片元着色器。

eg:

Shader "Custom/Simple VertexFragment Shader"{
    SubShader{
        Pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            float4 vert(float4 v:POSITION):SV_POSITION{
                return mul (UNITY_MATRIX_MVP, v);
            }
            fixed4 frag():SV_Target{
                return fixed4(1.0,0.0,0.0,1.0);
            }
            ENDCG
        }
    }
}

3、固定函数着色器:上面两种都使用了可编程管线,但是有些硬件不支持可编程管线着色器,固定函数着色器定义在Pass语义块。

注意:Unity Shader != 真正的shander:传统的shader仅可以编写特定类型的Shader,例如顶点着色器、片元着色器,而在Unity Shader可以在同一个.shader文件编写渲染流水线中多个阶段的控制。

 

 

你可能感兴趣的:(图像处理,unity)