Unity3D教程宝典之Shader篇:第十四讲Surface Shader

转载自风宇冲Unity3D教程学院

  用Shader来实现光照是比较复杂的,有不同的光类型,不同的阴影选项,不同的Render Path(forward和Deferred)。 Unity只是把光照模型封装处理了,Shader的代码还是用CG/HLSL编写的。

例一:最简单的Surface Shader

Shader "Custom/T_3_0" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        CGPROGRAM
        #pragma surface surf Lambert
        sampler2D _MainTex;
        struct Input {
            float2 uv_MainTex;
        } ;
        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
}

  

表面处理函数从顶点处理函数(这里自动顶点处理)接收参数Input IN,输出SurfaceOutput o至光照模型(这里是Lambert)。

这里我们就做了三件事:

(1)通过uv取得了贴图对应uv的颜色c

(2)把c.rgb赋给o.Albedo

(3) 把c.a赋给o.Alpha

这就完成了。之后让任一物体使用该Shader,则不管加什么光都能正确显示。真的很简单!

表面处理函数surf的输入及输出

 

(1)输入

struct Input {
    float2 uv_MainTex;
    float3 viewDir;
    float4 anyName:COLOR;
    float4 screenPos;
    float3 worldPos;
    float3 worldRefl;
} ;

  

uv_MainTex: uv

viewDir: 入视角

screenPos:裁剪空间位置

worldPos:世界空间位置

(2)输出

struct SurfaceOutput {
    half3 Albedo;
    half3 Normal;
    half3 Emission;
    half Specular;
    half Gloss;
    half Alpha;
};

  

Albedo:漫反射颜色

Normal: 法线

Emission:自发光颜色

Specular:镜面反射系数

Gloss:

Alpha:透明值

更多的参数请参考文档

Surface Shader参数

Surface Shader可以通过加参数实现额外的控制,例如加顶点处理函数,alpha混合等。

注意:

如果使用的光照模型是Unity自带的Lambert或者BlinnPhong:

alpha混合,alpha混合等功能必须使用Surface Shader参数。

之前例如AlphaTest Greater 0.3 等代码就不能再加了。如果加了的话,光照失效,物体为一片漆黑。

如果使用的光照模型是自定义光照模型:

只要在surf中给o.Alpha正常赋值(如赋贴图颜色的a值),那么之前例如AlphaTest Greater 0.3 等代码依然可以照常使用。具体相关代码可以参考下一讲中的代码。

(1)alpha混合

直接加参数Alpha即可

#pragma surface surf BlinnPhong alpha

(2)alphatest

加入一个变量,这里起名为_Cutoff, 然后在#pragma surface结尾处加上alphatest:_Cutoff。

效果是alpha值大于_Cutoff时,才会输出颜色

Shader "Custom/T_3_0" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
    SubShader {
        CGPROGRAM
        #pragma surface surf Lambert alphatest:_Cutoff
        sampler2D _MainTex;
        struct Input {
            float2 uv_MainTex;
        } ;
        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
}

  

(3)顶点函数

例:臃肿的模型

实现方法,将顶点向法线方向延伸一段距离

 Shader "Example/Normal Extrusion" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Amount ("Extrusion Amount", Range(-1,1)) = 0.5
    }
    SubShader {
        Tags { "RenderType" = "Opaque" }
        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
        struct Input {
            float2 uv_MainTex;
        };
        float _Amount;
        void vert (inout appdata_full v) {
            v.vertex.xyz += v.normal * _Amount;
        }
        sampler2D _MainTex;
        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        }
        ENDCG
    }
    Fallback "Diffuse"
}

  

(4)finalcolor

finalcolor:ColorFunction

对颜色输出作最后的更改

Shader "Example/Tint Final Color" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _ColorTint ("Tint", Color) = (1.0, 0.6, 0.6, 1.0)
    }
    SubShader {
        CGPROGRAM
        #pragma surface surf Lambert finalcolor:mycolor
        struct Input {
            float2 uv_MainTex;
        };
        fixed4 _ColorTint;
        void mycolor (Input IN, SurfaceOutput o, inout fixed4 color)
        {
            //在这里对最后输出的颜色color进行修改
            color *= _ColorTint;
        }
        sampler2D _MainTex;
        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        }
        ENDCG
    }
 }

  

更多的参数请参考文档

时间: 2024-10-04 18:57:32

Unity3D教程宝典之Shader篇:第十四讲Surface Shader的相关文章

Unity3D教程宝典之光影烘焙:第四讲脚本控制

上一讲讲了用Light probes实现动态物体的非实时阴影,这一讲讲用代码实现代码实现动态物体的非实时阴影. 实现步骤:(1)新建一个场景,并建一个plane作为大地(2)创建Cube并缩放成扁平面后.复制Cube并旋转拼接搭建成一个敞篷.(3)讲上述物体设置static并烘焙.(4)创建一个player.这里用的unity自带的Character Controller包里的 3rd person controller这个prefab,拖进敞篷边.在该人物下找到Bip001 Pelvis这个节

Unity3D教程宝典之Shader篇:第四讲制作一个美丽的地球

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 Vertex and Fragment Shader例子二,制作一个自动旋转的3D地球. 下载美丽的地球工程 原理是 2张贴图,一张地球图,一张云层分布图(1)通过uv.x即纹理坐标的横轴与时间相乘,产生球在移动的效果 (2)通过地球和云的颜色值叠加形成 层叠 的效果.注意:贴图的'Wrap Mode'属性一定要设置成Repeat                              关于Wrap Mode当Wrap Mode为Cl

《上古天真论》第十四讲文字版

上古天真论篇第十四讲 主讲:徐文兵  主持:梁  冬 播出时间:2009-03-14  23:00—24:00 经文:季以恬愉为务,以自得为功,形体不敝,精神不散,亦可以百数.其次有贤人者,法则天地,象似日月,辨列星辰,逆从阴阳,分别四时,将从上古合同于道,亦可使益寿而有极时. 梁冬:是的,重新发现中医太美,大家好!欢迎收听在这么晚,晚上十一点,坚持收听国学堂之重新发现中医太美,非常感谢!也同时呢,感谢我们今天的徐老师来到我们今天的演播室,徐老师你好!徐文兵:梁冬好!听众朋友们大家好!梁冬:是的

Unity3D教程宝典之Shader篇:第十六讲自定义光照模型

转载自风宇冲Unity3D教程学院   十四讲我们实现了基本的Surface Shader,十五讲讲了光照模型的基础知识.这一讲说的是如何写光照模型. 自定义光照模型主要分为4步: (0)架设框架,填写需要的参数 (1)计算漫反射强度 (2)计算镜面反射强度 (3)结合漫反射光与镜面反射光 代码配有中文注释,配合上上讲的光照公式,一步一步实现即可. //Author: 风宇冲 Shader "Custom/T_customLightModel" { Properties { _Main

Unity3D教程宝典之Shader篇:第十二讲 Alpha测试

转载自风宇冲Unity3D教程学院 引言:本讲和下一讲主要讲Alpha即透明通道有关的内容.RGBA,其中最终在屏幕上显示的只有RGB即 红绿蓝组成的颜色,Alpha并没有任何颜色显示.A只是辅助颜色运算特别是多图层运算而已.例如在单图层的情况下(1,1,1,0.8)输出的是(1,1,1)*0.8即 浅灰色(0.8,0.8,0.8),和(0.8,0.8,0.8)是等价的.但是假如不再是单图层而背景为绿色(0,1,0,1)的时候,(0.8,0.8,0.8)就不知道怎么去运算了,而(1,1,1,0.

Unity3D教程宝典之Shader篇:第二十讲法线贴图

转载自风宇冲Unity3D教程学院 上一讲我们讲了凹凸贴图以及生成法线贴图. 这一讲来谈谈怎么使用法线贴图. 一:法线贴图的原理 二:法线贴图的实现 三:法线贴图的使用 四:法线贴图的格式 一:法线贴图的原理 光照效果很大程度上是由垂直于物体表面的法线决定的,因为法线影响反射光的方向.均匀垂直的法线是镜面贴图.但是有时候我们会给一个平面使用砖墙贴图,砖墙应该是凹凸不平的,而如果让砖墙使用该平面的法线的话,画面就会很假,神马?一面墙像镜子一样反光=.= 而如果按真实砖墙去做模型的话,即做高精度模型

Unity3D教程宝典之Shader篇

教程目录 基础讲:Shader学习方法基础讲:基础知识特别讲:常见问题解答特别讲:CG函数 第一讲: Shader总篇第二讲: Fixed Function Shader 第三讲: Vertex&Fragment Shader基础 第四讲: 制作一个美丽的地球第五讲:LOGO闪光效果 第六讲:TexGen第七讲:流程图第八讲:Why CG?第九讲:Render Path第十讲:雾化第十一讲:阴影面剔除及深度测试第十二讲:alpha测试第十三讲:alpha混合第十四讲:Surface Shader

2Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载

转载自风宇冲Unity3D教程学院 http://blog.sina.com.cn/s/blog_471132920101crh3.html 引言:想用Unity3D制作优秀的游戏,插件是必不可少的.工欲善其事必先利其器.本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具.为此我写了插件的经验及理论讲解,涉及插件的 学习/辨别/选择/配合.也写了插件的 评测/教程/下载.关于评测,带有一定的主观性,仅供参考.关于教程,热门插件网上已经有很多教程了,本文提供链接,网上资料少的插

Unity3D教程宝典之光影烘焙:第二讲AreaLight

Area Light,俗称面灯.没有任何实时光照的效果,仅用于Light baking即烘焙.创建一个Area Light,界面如下 Color:颜色Intensity:强度,Width:宽Height:高 Scale缩放对光没有任何影响.主要是宽高调整面的区域大小.选中Arealight后,Arealight的区域会在Scene窗口中以黄线框显示,AreaLight的Z轴指向的方向即光照的方向. 用AreaLight烘焙室内灯光效果(1)创建一个空场景(2)创建Cube并缩放成扁平面后.复制C