最近学习 Shader中,备忘录吧,自己看的
实现效果
高光纹理光照模型展示图.png
高光纹理光照模型
Shader "Unlit/NewUnlitShader"
{
Properties{
_Diffuse("Color Tint",Color) =(1.0,1.0,1.0)//漫反射颜色
_Specular("Specular",Color) =(1,1,1)//反射光颜色
_Gloss("Gloss",Range(2,256)) = 5//反射光大小
_MainTex("MainTex",2D) = "White"{}//贴图纹理
_Color("Color",Color) = (1.0,1.0,1.0)//贴图颜色
}
SubShader
{
LOD 100
Pass
{
Tags {"LightMode"="ForwardBase"}//渲染模式-常用格式 Tags{"标签"=""}
CGPROGRAM
#pragma vertex vert //方法声明
#pragma fragment frag
#include "Lighting.cginc"
#include "UnityCG.cginc"
fixed4 _Diffuse; // 漫反射
fixed4 _Specular; //高光系数
half _Gloss; //高光区域大小
sampler2D _MainTex;//贴图
float4 _MainTex_ST;//这里名字不能乱取 _MainTex取自贴图名称,S代表Scale-缩放,T代表Transform-偏移,_MainTex.xy代表缩放,_MainTex.zw代表偏移
fixed4 _Color;//颜色
//a-application 2-to v-view application to view //获取对象的属性,更具语义会自动把数据填充,用的时候直接取就行
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
//存储属性 当处理完数据后,将数据对应存储到这个结构体内,然后返回,
//这里祈祷存储属性的作用,同样的,更具语义会给相应的的系统属性设置数据
struct v2f {
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos:TEXCOORD1;
float2 uv : TEXCOORD2;
};
v2f vert (a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);//裁剪到摄像机视图
o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject);//转换到世界法线
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;//转好到世界位置
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);//计算变换后的纹理坐标
return o;
}
fixed4 frag(v2f i) :SV_Target{
//纹理采样,第一个参数是纹理名字,第二个纹理uv坐标
fixed3 albedo = tex2D(_MainTex,i.uv).rgb * _Color.rgb;
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//获取光线
fixed3 normalDir = normalize(UnityObjectToWorldNormal(i.worldNormal));//法线方向
fixed3 wordLightDir = normalize(_WorldSpaceLightPos0.xyz);//获取世界光方向->归一
//漫反射计算公式公式:光照颜色 * 漫反射颜色 * 绝对值(世界法线于世界光方向的点积)-> 兰伯特漫反射定律
//缺陷是背光面完全看不见
//升级版 半兰伯特漫反射定律 -> 光照颜色 * 漫反射颜色 * 绝对值(世界法线于世界光方向的点积 * 0.5 +0.5)
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(normalDir,wordLightDir)*0.5+0.5);
//fixed3 reflectDir = normalize(reflect(-wordLightDir,normalDir));
//获取视角方向
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
// fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);
//高光反射方向
fixed3 halfDir = normalize(wordLightDir+viewDir);
//公式: 入射光颜色 * 材质反射颜色 * (绝对值(视角方向和反射光方向的点积)^光泽度)
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(normalDir,halfDir)),_Gloss);
//将渲染颜色返回
return fixed4(ambient + diffuse + specular,1);
}
ENDCG
}
}
}
透明度测试
实现效果展示
Shader "Unlit/JKShader"
{
Properties
{
_Color ("Color",Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
_CutOff("Cut Off",Range(0,1)) = 0.5
}
SubShader
{
Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }
Pass
{
Tags {"LightModel"="ForwardBase"}
CGPROGRAM
// Upgrade NOTE: excluded shader from DX11; has structs without semantics (struct v2f members pos,worldNormal,worldPos,uv)
#pragma exclude_renderers d3d11
#pragma vertex vert
#pragma fragment frag
// make fog work
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
fixed _CutOff;
struct a2v{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float2 uv : TEXCOORD2;
};
//顶点着色器
v2f vert(a2v v) {
v2f o;
o.pos = UnityWorldToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
//片元着色器
fixed4 frag(v2f i):SV_Target{
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed4 texColor = tex2D(_MainTex,i.uv);//采样
clip(texColor.a - _CutOff);// texColor.a < _Cutoff 则舍弃渲染 discard
fixed3 albedo= texColor.rgb * _Color.rgb;//颜色和输入颜色混合=>入射光颜色
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//环境光混合采样颜色
fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir));
return fixed4(ambient+diffuse,1.0);
}
ENDCG
}
}
}