Surface Shader 表面着色器

描述

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

工作方式


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


分析

创建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

Surface Shader简单向导的更多相关文章

  1. Unity Shader——Writing Surface Shaders(3)——Surface Shader Lighting Examples

    Surface Shader 光照例子 这里有一些自定义光照模型和Surface Shaders的例子.通常的Surface Shader例子在这里. 由于延迟光照在某些自定义的逐材质光照模型中表现得 ...

  2. Unity Shader——Writing Surface Shaders(1)——Surface Shader Examples

    这里有Surface Shader的一些例子.下面的这些例子关注使用内建的光照模型:关于如何使用自定义光照模型的例子参见Surface Shader Lighting Examples. 简单 我们将 ...

  3. Surface Shader

    Surface Shader: (1)必须放在SubShdader块,不能放在Pass内部: (2)#pragma sufrace surfaceFunction lightModel [option ...

  4. 【Unity Shaders】初探Surface Shader背后的机制

    转载请注明出处:http://blog.csdn.net/candycat1992/article/details/39994049 写在前面 一直以来,Unity Surface Shader背后的 ...

  5. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  6. unity surface shader 1

    Unity ShaderLib :  CGPROGRAM  ENDCG之间是CG代码,之外的代码功能都由ShaderLib提供,CG中的一些方法比如tex2D(...)也是ShaderLib对CG进行 ...

  7. Unity Shader (三)Surface Shader机制

    转自:http://blog.csdn.net/candycat1992/article/details/39994049 写在前面 一直以来,Unity Surface Shader背后的机制一直是 ...

  8. unity, surface shader access world position and localposition

    一,surface shader中访问worldposition 在surface shader中访问世界坐标,只需在Input结构体中声明float3 worldPos即可,如下:  struct  ...

  9. 【Unity Shaders】Diffuse Shading——在Surface Shader中使用properties

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

随机推荐

  1. MFC 创建多层目录

    创建多层目录 BOOL CTestToolCtr::CreateFolder(CString strNewFolder) { /************************************ ...

  2. C# 小知识

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  3. facebook 简单的图文分享

    参考网址:http://www.mrfangge.com/facebook-page-share-settings/ 首先在facebook 注册开发者,新增一个应用,这里就要一个生所的应用 app_ ...

  4. 第三十一篇:SOUI布局之相对于特定兄弟窗口

    SOUI中通过pos的标志如:[, {, }, ],这4个标志可以相对于前一个及后一个兄弟窗口,但是有时候希望相对于不是前后窗口的兄弟窗口,比如一个通过一个中心窗口同时定义它的上下左右4个窗口,这个时 ...

  5. SQL 语句与性能之执行顺序

    select * , t3.Name from t1 left join t2 on t1.sysno = t2.Asysno left join t3 on t3.sysno = t2.Bsysno ...

  6. SQL常见优化Sql查询性能的方法有哪些?

    常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...

  7. openfl使用64位的ndk时,编译报错的问题!

    当使用64位的ndk时,如果使用openfl test android运行android测试,应该会出现 arm-linux-androideabi-g++:找不到这个命令的错误. 原因是,haxel ...

  8. LNMP虚拟机开发环境配置--vagrant+virtualbox+ubuntu14.04

    工作一直用的是别人打包好的虚拟机开发环境,感觉确实很酷.所以准备自己配个开发环境,为之后自己开发一些有趣的东西做准备. ok,开始~~~ 一.安装软件 vagrant和virtualbox 此处需注意 ...

  9. java 日期格式

  10. 基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法

    基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法 Siamese CNN Temporally Constrained Metrics T ...