Shader是3D游戏中的重要组成部分,它能够对3D对象表面的纹理和特性进行处理,表现出各种材质效果。
Unity提供的内置Shader其种类已经非常丰富,并提供原码下载。在Unity中,Shader和Materials(材质)是密不可分的,Shader提供了各种材质属性,并且支持CG语言,而Materials则像是Shader的示例,可以调节Shader的属性并指定给模型。
1. 10.1 自定义字体
- 新建Unity工程,在Windows/fonts目录内复制COOPBL.TTF字体(或任意其他字体)到Unity的工程目录内。
- 在Project窗口选择导入字体,在菜单栏选择【GameObject】-> 【Create Other】-> 【3D Text】在场景中创建一个3D文字。
- 仍然选择导入的字体,在Inspector窗口将Character设为ASCII defualt set,选择Apply确定。然后选择右上方的齿轮按钮,在其子菜单选择【Create Editable Copy】为当前字体创建一个可编辑的副本。
- 创建出的字体副本有3个文件,其中.png文件是一张文字图片,我们可以使用2D图像处理软件如Photoshop修饰这张图片,使其更具有艺术效果。
- 在Unity中,确定字体副本的图片仍处于选择状态,在Inspector窗口将它的Format设为ARGB32bit。
- 在场景中选择3D文字,将创建的文字副本指定给3D文字替换掉原来的字体。
1.10.2 创建Shader
- 在Project窗口单击右键,选择【Create】-> 【Shader】创建一个新的Shader,双击打开这个Shader文件,它里面包括了一些基本的Shader代码。
Shader "Custom/NewSurfaceShader" { 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; // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. // #pragma instancing_options assumeuniformscaling UNITY_INSTANCING_BUFFER_START(Props) // put more per-instance properties here UNITY_INSTANCING_BUFFER_END(Props) 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" }
- Shader "Custom/NewSurfaceShader"语句中双引号的部分定义了这个Shader在Unity中的名称。
- Properties定义了Shader的属性,属性_MainTex ,"Albedo (RGB)"是默认的属性名称,这个名称会显示在编辑器中,它的实际属性是 2D,表示2D贴图,"white"是2D贴图的默认名称,“white”、“black”、“gray”or“bump”都是Unity内置的默认贴图名称。这部分具体内容可以参考Unity帮助文档ShaderLab syntax:Properties部分。
- 每个Shader都是由若干个SubShader的定义组成的,至少要有一个,当读入Shader的时候,会从第一个SubShader开始检查是否支持当前硬件,如果都不支持,则调用FallBack“Diffuse”,使用一个默认的Shader。
- SubShader 中的Tags是用来告诉渲染器如何渲染这个SubShader,它的值都是由=号连接成对的字符串,关键字与值对应的形式。当前的RanderType的值为Opaque,表示这是一个不透明的Shader。这部分的具体内容可以参考Unity帮助文档的ShaderLab syntax:SubShader Tags部分。
- SubShader中的LOD表示当前的SubShader所支持的功能细节级别,200表示Diffuse级别。我们可以在C#代码中调用Shader.maximumLOD设置一个值,如果当前SubShader的LOD值大于所设置的值,那么这个SubShader将不能使用。设置它主要是考虑不同大的硬件对Shader的支持情况,具体可以参考Unity帮助文档Shader Level of Detail部分。
- 标识符CGPROGRAM到ENDCG之间使用CG语言进行编程的部分,CG语言是标注的Shader语言,掌握它可以实现几乎任何类型的Shader,不过它比较复杂,可以找专门的教程来进行学习。
- 我们要将Shade的名字改掉,将Shader "Custom/NewSurfaceShader"改为Shader “Custom/My3DFont”。
- 修改代码,代码如下:
Shader "Custom/My3DFont" { Properties { //添加色彩属性,主要用来提供alpha控制 _Color ("Main 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"="Transparent" "IgnoreProject"="True" "Queue"="Transparent"} LOD 200 Pass{ //在材质中添加对色彩属性的支持 Material{ Diffuse[_Color] } Blend SrcAlpha OneMinuSrcAlpha //alpha融合方式 Lighting Off //不受光源影响 Cull Off //双面显示 ZTest Allways//总显示在最前面 ZWrite Off //不把像素此写到Depth通道中 Fog{ Mode Off }//不受雾的影响 SetTexture[_MainTex]{ constantColor [_Color] combing texture * constant } } } FallBack "Diffuse" }
- Color属性提供了色彩功能,默认值是纯白色。除了改变颜色,Shader有了Alpha,可以表现半透明效果。
- RanderType 现在被设为Transparent,表示这是一个有透明效果的Shader。
- IgnoreProjector设为true,这个Shader将不受Projector(用来模拟投影或之类效果的投射器)影响。
- Queue设置Shader的渲染顺序为Transparent,默认的渲染顺序依次为Background,Geometry,AlphaTest,Transparent,Overlay。
- Pass部分可以使Shader渲染一次,在其中我们可以设置多种渲染选项。
- SetTexture[_MainTex]为Shader设置贴图,combine使贴图和颜色属性融合
- 选择字体副本的材质,将Shader设为My3DFont,场景中的3D文字也会产生变化。