【Reading Notes】CP1-Create a basic Standard Shader

开篇

每一个使用Unity的开发人员都应该熟悉components(组件)这个概念。在Unity游戏中所有的Object(对象)都包含的一定数量的的components,这些components实际影响了Oject的显示和行为。Scripts(脚本)决定了Object的行为,renderers(渲染器)决定了它们如何显示在屏幕上。Unity当中有几种渲染器,使用那种这取决于我们想要显示对象的类型。每一个3D模型都有MeshRenderer(网格渲染器),一个Object应该只有一个renderer,但每个renderer可以拥有多个matrials(材质)。这里的每个材质使用了一个Shader去修饰(定义),Shader是3D渲染流程的最后一环.组件之间的关系如下:

第一个Shader

选择合适的文件夹,鼠标右键创建材质和Shader.

Shader "cookbook/StandardDiffuse" {
    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"
}

技术上来说,这是一个基于物理的(physically-based)Surface Shader, 在Unity5成为了标准Shader。从名称上可以看出,这个类型的Shader较为真实的模拟了当光照射到物体表面的时候的物理表现。如果你使用Unity4版本,将会看到生成的代码有很大的不同。在介绍基于物理的Shader之前,先看看Unity4相对来说技术上比较简单的Shader.所有这些类型的Shader都会在下一章节一一探讨。

着色器如何工作

在Unity中使用Surface Shader的环境和运行将是十分简单的工作,对于你来说只是点击几下鼠标就好。但有很多关于Surface Shader的工作Unity都已经为了做了。Unity 使用Cg 着色器语言,对其进行了精心的封装,封装了大量的细节。Surface Shader更多的是使用基于组件的思想去编写。一些例如处理纹理坐标,矩阵的变换的任务都已经为你做好了,所以再也不需要去重新编写这些逻辑。在以前,我们在编写一个新的Shader的时候我们不得不一遍一遍的重复书写一些相同的代码,随着你越来越了解Surface Shaders, 会很自然的会想要了解CG语言的底层函数和Unity在底层是怎么处理这个GPU的渲染任务的。

在Unity5中内建的Shaders是默认隐藏的,你不能在Editor中打开官方的Shader. 大部分Unity内建的CG函数,都可以在Unity的安装目录中找到(Unity45\Editor\Data\CGIncludes),在这里你可以看到Unity使用的一些工具函数的源码。还可以到官网网站上下站各个版本的内建Shaders源码.

Unity5中遗留的Unity4版本的Shanders

不可以否认的是在过去十年视频图像游戏发生了翻天覆地的变化。每一款使用了最顶尖技术的新游戏都越来越接近现实环境[?]. 所以不必为Unity Shader变化十分大这个事实感到惊讶。在Unity5之前,主要有两种Shader:Diffuse & Specular. 如名称意义,它们用于不光滑和反光的材质,另外,如果以正在使用Unity5,可以选择跳过这一章节。本章节主要说明怎样移植这些效果到Unity5中。

Unity5可以自动升级Unity4版本的工程,untiy4中的shader将被替换成Unity5中的Lagacy Shader(Unity5为了兼容,而保留)

为Shader添加properties(属性)

Properties 在Shader的渲染管线中十分重要,让用户可以改变纹理,调整shader的各种属性。Properties提供了为Shader的调整提供了可视化的途径。

属性的结构:

_AmbientColor (“Ambient Color”, Color) = (1, 1, 1, 1)

[变量名]   [Inspector 名称] [Type]  [默认值]

属性类型:

Range(min, max) float 滑动条

Color 颜色(float, float, float, float)

2D 2D 纹理

Rect ?纹理

Cube 立方体纹理

Float 浮点值

Vector 向量(float, float, float, float)

使用properties

需要再SubShader中再次声明属性才可以使用。

你可能感兴趣的:(unity,shader,cookbook,读书笔记/Reading,Notes,——U5.x,Shader&Effects,cookbook)