//显示固定颜色
Shader "Custom/lesson01"{
properties{
_MainColor("颜色", Color) = (1,1,1,1)
}
SubShader{
Tags {"RenderType" = "Opaque"}
LOD 200
CGPROGRAM
#pragma surface mysurf Lambert
struct Input{
fixed4 color : COLOR;
};
fixed4 _MainColor;
void mysurf(Input IN, inout SurfaceOutput o){
o.Albedo = _MainColor;
}
ENDCG
}
}
//显示贴图Shader
Shader "Custom/lesson01_02"{
Properties{
_MainTex("贴图", 2D) = "white"{}
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
}
ENDCG
}
}
//显示贴图 + 法线 Shader
Shader "Custom/lesson01_03"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_BumpMap("法线贴图", 2D) = "bump"{}
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
float2 uv_BumpMap;
};
sampler2D _MainTex;
sampler2D _BumpMap;
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//法线值
half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = c.rgb;
o.Normal = normal;
}
ENDCG
}
}
//显示边缘光照 Shader
Shader "Custom/lesson01_04"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_BumpMap("法线贴图", 2D) = "bump"{}
_RimColor("边缘光颜色", Color) = (0.26,0.19,0.16,0.0)
_RimPower("边缘光强度", Range(0, 10)) = 3.0
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
float2 uv_BumpMap;
//摄像机相对阳光的方向
float3 viewDir;
};
sampler2D _MainTex;
sampler2D _BumpMap;
fixed4 _RimColor;
float _RimPower;
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//法线值
half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = c.rgb;
o.Normal = normal;
//计算眼睛看到区域边缘光的强度,法线向量与眼睛直视的夹角,夹角等于90度时,证明看到的位置在最边缘,边缘光越强
//当夹角等于0时,是眼睛正对方向,没有边缘光
half rim = 1 - dot(normalize(IN.viewDir) , o.Normal);
o.Emission = _RimColor.rgb * pow(rim, _RimPower);
}
ENDCG
}
}
//显示贴图 + 法线 + 细节贴图 Shader
Shader "Custom/lesson01_05"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_BumpMap("法线贴图", 2D) = "bump"{}
_Detail("细节",2D) = "gray"{}
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
float2 uv_BumpMap;
float2 uv_Detail;
};
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _Detail;
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//法线值
half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = c.rgb;
o.Albedo *= tex2D(_Detail, IN.uv_Detail) * 2;
o.Normal = normal;
}
ENDCG
}
}
//显示贴图 + 法线 + 屏幕空间细节贴图 Shader
Shader "Custom/lesson01_06"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_BumpMap("法线贴图", 2D) = "bump"{}
_Detail("细节",2D) = "gray"{}
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
float2 uv_BumpMap;
float2 uv_Detail;
float4 screenPos;
};
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _Detail;
void surf (Input IN, inout SurfaceOutput o){
//法线值
half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Normal = normal;
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
//还原屏幕坐标
float2 screenUV = IN.screenPos.xy/IN.screenPos.w;
o.Albedo *= tex2D(_Detail, screenUV ) * 2;
}
ENDCG
}
}
//立方体反射Shader
Shader "Custom/lesson01_07"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_Cube("CubeMap",CUBE) = ""{}
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
//世界空间反射向量
float3 worldRefl;
};
sampler2D _MainTex;
samplerCUBE _Cube;
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Emission = texCUBE(_Cube, IN.worldRefl);
}
ENDCG
}
}
//切片
Shader "Custom/lesson01_08"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_BumpMap("法线贴图", 2D) = "bump"{}
_SliceNum("切片数量", Float) = 1
_SliceAngle("切片角度", Float) = 1
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 worldPos;
};
sampler2D _MainTex;
sampler2D _BumpMap;
float _SliceNum;
float _SliceAngle;
void surf (Input IN, inout SurfaceOutput o){
//clip清除负数的像素 frac取小数 _SliceNum没米切多少个
clip(frac((IN.worldPos.y + IN.worldPos.z * _SliceAngle) * _SliceNum) - 0.5);
//法线值
o.Albedo = tex2D(_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
}
}
//法线挤压与顶点修改
Shader "Custom/lesson01_09"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_Amount("挤压强度",Float) = 1
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert vertex:vert
struct Input{
float2 uv_MainTex;
};
sampler2D _MainTex;
float _Amount;
//顶点数据
void vert (inout appdata_full v){
//将顶点延法线向量 向外扩张 _Amount
v.vertex.xyz += v.normal * _Amount;
}
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
}
ENDCG
}
}
//法线挤压与顶点修改
Shader "Custom/lesson01_09"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_Amount("挤压强度",Float) = 1
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert vertex:vert
struct Input{
float2 uv_MainTex;
};
sampler2D _MainTex;
float _Amount;
//顶点数据
void vert (inout appdata_full v){
//将顶点延法线向量 向外扩张 _Amount
v.vertex.xyz += v.normal * _Amount;
}
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
}
ENDCG
}
}
//最终颜色修改
Shader "Custom/lesson01_11"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_ColorTint("最终色", Color) = (1,1,1,1)
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert finalcolor:myfinal
struct Input{
float2 uv_MainTex;
};
sampler2D _MainTex;
fixed4 _ColorTint;
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
}
//最终颜色修改 color在surf执行完之后的颜色
void myfinal(Input IN, SurfaceOutput o, inout fixed4 color ){
color *= _ColorTint;
}
ENDCG
}
}
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
//自定义雾效
Shader "Custom/lesson01_12"{
Properties{
_MainTex("贴图", 2D) = "white"{}
_FogColor("雾颜色", Color) = (1,1,1,1)
}
subShader{
Tags {"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert finalcolor:final vertex:vert
struct Input{
float2 uv_MainTex;
fixed fog;
};
sampler2D _MainTex;
fixed4 _FogColor;
void vert(inout appdata_full v, out Input data){
//初始化
UNITY_INITIALIZE_OUTPUT(Input, data);
//矩阵相乘 三维坐标转屏幕坐标
float4 hpos = UnityObjectToClipPos(v.vertex);
//0.1 十米范围内,渐变
data.fog = min(1, dot(hpos.xy,hpos.xy) * 0.01);
}
void surf (Input IN, inout SurfaceOutput o){
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
}
void final(Input IN, SurfaceOutput o, inout fixed4 color){
//从本身颜色,到自选颜色,差值为十米内渐变的值
color.rgb = lerp(color.rgb, _FogColor, IN.fog);
}
ENDCG
}
}
网友评论