【Reading Notes】CP1-Create a basic Standard Shader

本文详细介绍了Unity中Shader的基本概念与工作原理,包括如何使用SurfaceShader进行3D渲染,以及Unity5中新引入的标准Shader特性。同时,还探讨了从Unity4升级到Unity5时Shader的迁移方法。

开篇

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

第一个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中再次声明属性才可以使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值