shader分两种
1:表面着色器(Surface Shader) - 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。
2:片段着色器(Fragment Shader) - 可以做的事情更多,可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。
这里的教程主要讲表面着色器
以Diffuse Texture为例直接贴代码加注释
Shader "Custom/Diffuse Texture" {
Properties//Shader属性定义
{
_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 //金属光泽度
//定义属性的语法:_Name("Display Name", type) = defaultValue[{options}]
//_Name - 属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容
//Display Name - 这个字符串将显示在Unity的材质编辑器中作为Shader的使用者可读的内容
//type - 这个属性的类
}
SubShader//子着色器部分
{
//表面着色器可以被若干的标签(tags)所修饰,
//而硬件将通过判定这些标签来决定什么时候调用该着色器。
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM//这是一个开始标记,表明从这里开始是一段CG程序
//语法 pragma surface surfaceFunction lightModel [optionalparams]
//surface - 声明的是一个表面着色器
//surfaceFunction - 着色器代码的方法的名字,在下面可以找到对应的方法
//lightModel - 使用的光照模型。
#pragma surface surf Standard fullforwardshadows
//编译着色器模式3.0:
#pragma target 3.0
//在CG模块中重定义属性
fixed4 _Color;
half _Glossiness;
half _Metallic;
sampler2D _MainTex;//sampler2D类型就是在hlsl中的的2d贴图类型
struct Input//用于作为输入参数的Input,必须命名为Input
{
float2 uv_MainTex;
};
///主要渲染函数
void surf (Input IN, inout SurfaceOutputStandard o)
{
//tex2D函数:在一张贴图中对一个点采样,返回float4
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
//将物体显示的漫反射颜色设置成在纹理的颜色值
o.Albedo = c.rgb;
//将物体显示的金属光泽设置成在properties中定义的光泽
o.Metallic = _Metallic;
//设置物体显示的光滑度
o.Smoothness = _Glossiness;
//设置物体显示的透明度
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
第一篇就到这里,可以对着例子写一个自己的第一个shader了