一、概念
材质:shader、贴图、颜色选择、参数
Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出
简单讲:shader:贴图+颜色+参数设定二、分类
(1)表面着色器
(2)片着色器
三、结构
【着色器组成】
1.属性定义:指定代码有哪些输出
2.子着色器:N个子着色器,具体执行哪个有平台决定,这个是代码的主题
3.回滚:用来处理Subshader都不能运行的情况
四、实例讲解
Shader "Custom/Diffuse Texture" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
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
}
FallBack "Diffuse"
}
1:Properties{}:属性定义
(1)语法定义:_Name("Display Name", type) = defaultValue[{options}]
(2)例子: _MainTex ("Base (RGB)", 2D) = "white" {}
(3)_Name:属性的名字,就是个变量,在下面的代码会用到
(4)Display Name :在在Unity的材质编辑器中作为Shader的使用者可读的内容
(5)type : 这个属性的类型可以包括(Color ,2D ,Rect ,Cube ,Range(min, max),Float ,Vector )
(6)defaultValue:定义一个属性的默认值(如果是Color -(1,1,1,1);如果是2D/Rect/Cube -tint颜色的字符串,可以是空字符串或者”white”,”black”,”gray”,”bump”中的一个)
(7)2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{}
2: SubShader {}:程序主题
3:Tags:表面着色器可以被若干的标签(tags)所修饰,而硬件将通过判定这些标签来决定什么时候调用该着色器。
(1)告诉系统什么时候调用我们
(2){ "RenderType"="Opaque" }:渲染非透明物体时调用
(3){"RenderType"="Transparent"}:含有透明效果的物体时调用
(4){"IgnoreProjector"="True"}:不被Projectors影响
(5){"ForceNoShadowCasting"="True"}:从不产生阴影
(6){"Queue"="xxx"}:指定渲染序列如果你使用Unity做过一些透明和不透明物体的混合的话,很可能已经遇到过不透明物体无法呈现在透明物体之后的情况。这种情况很可能是由于Shader的渲染顺序不正确导致的。Queue指定了物体的渲染顺序
<1>Background - 最早被调用的渲染,用来渲染天空盒或者背景
<2>Geometry - 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)
<3>AlphaTest - 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑
<4>Transparent - 以从后往前的顺序渲染透明物体
<5>Overlay - 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)
4.LOD很简单,它是Level of Detail的缩写
5.CGPROGRAM开始,ENDCG结束
6.#pragma surface surf Lambert
(1)#pragma surface surfaceFunction lightModel [optionalparams]
(2)surface - 声明的是一个表面着色器
(3)surfaceFunction - 着色器代码的方法的名字(下面就会用到这个方法)
(4)lightModel - 使用的光照模型
7.sampler2D _MainTex:因为前面定义了变量,这里还要在重新定义下,才能在后面使用。(sampler2D就是GLSL中的2D贴图的类型)
8.void surf(){}:这个是要进行处理的方法
(1)这个方法是已经定义好的,必须这样写才行,参数的类型
(2)Input IN:是个结构(输入)
(3)inout SurfaceOutput o:是个结构(输出)
(4)_MainTex:贴图变量
(5)uv_MainTex:贴图变量的坐标值
(6)在计算输出时Shader会多次调用surf函数,每次给入一个贴图上的点坐标,来计算输出
(7) half4 c = tex2D (_MainTex, IN.uv_MainTex):在一张贴图中对一个点进行采样的方法,返回一个float4
(8) o.Albedo = c.rgb:并将其颜色的rbg值赋予了输出的像素颜色
(9)o.Alpha = c.a:将a值赋予透明度