Surface Shader简单向导

Surface Shader 表面着色器

描述

当你的Material要处理光照,则一般使用Surface Shader。Surface Shader隐藏了光照的计算,你只需要在surf函数里设置好反射率、法向量等值就行。这些值会被送到Lighting model中进行计算,然后就会输出每个像素的RGB值。实际上,SurfaceShader最终会编译成VertexShader和FragmentShader,因此编写SurfaceShader可以帮我们省下许多工作。

工作方式

Surface Shader简单向导
3D模型送入到表面着色器中,首先是经过顶点调节器来处理顶点,然后把结果送入到表面函数中处理,接着把结果送到光照模型中,最终输出所有像素的颜色。


分析

创建Surface Shader

Surface Shader简单向导

模板代码

Shader "Custom/SurfaceShader" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

代码分析

Properties分析

  1. _Color:物体的基色
  2. _MainTex:物体上的纹理
  3. _Glossiness:光泽度,控制高光的反射能力
  4. _Metallic:金属性

Tags

主要是用来控制渲染的选项,比如渲染的顺序(Rendering order)和渲染类型(Rendering Type)等。
具体的选项可查看官方文档浅墨的博客

LOD

LOD是Level of Detail的缩写,表示细节层次效果,主要是通过控制细节的显示效果来达到优化,只有LOD值小于QualitySettings 的Maximum LOD Level的Shader才会被打进包里使用。
具体LOD定义可以参考WIKI,LOD值可以参考 Unity圣典

CG程序

  1. CGPROGRAMENDCG之间存放的就是CG程序。
  2. 预编译头:#pragma surface surf Standard fullforwardshadows
    surface表示这是一个Surface Shader,surf表示表面函数的名字,Standard表示使用Standard的光照模型,fullforwardshadows是阴影类型
  3. 预编译头:#pragma target 3.0
    Shader model的版本,用来获取更好的光照效果
  4. 剩余的就是如何操作surf函数
    这里只是简单的进行赋值,因此会困惑人的地方就是CG语法了,CG可以参考The Cg Tutorial

参考

  1. 官方文档
  2. 浅墨的博客
  3. 猫都能学会的Unity3D Shader入门指南
  4. A gentle introduction to shaders in Unity3D
  5. The Cg Tutorial
上一篇:团队项目第二阶段个人进展——Day9


下一篇:leetcode《按递增顺序显示卡牌》