// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "Custom/vertFragShader" {
Properties {
_Diffuse ("Diffuse", Color) = (1,1,1,1)
_SpecColor("SpecColor", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_SpecularTex ("Specular (RGB)", 2D) = "white" {}
_NormalTex ("Bump (RGB)", 2D) = "white" {}
_BumpFactor ("Bump Scale", Range(-10.0, 10.0)) = 0.0
_SpecularMapScale ("SpecularMapScale", Range(-10, 10)) = 0
_SpecShininess("Specular Shininess", Range(-10.3, 10.3)) = 2.0
_ColorDepth("ColorDepth", Range(-10.0, 10.0)) = 2.0
_Gloss("Gloss", Range(-10.0, 10.0)) = 4
_StartCutoff("StartCutoff", Range(-1, 181)) = 0
_EndCutoff("EndCutoff", Range(-1, 181)) = 0
_Cutoff("Cutoff", Range(0.0, 1.0)) = 1
}
SubShader {
Tags { "RenderType"="Transparent" "IgnoreProjector"="True" "Queue"="Transparent"}
Pass
{
Tags { "LightMode" = "ForwardBase"}
//ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
#include "HLSLSupport.cginc"
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
fixed4 _Diffuse;
//fixed4 _SpecColor;
sampler2D _MainTex;
sampler2D _SpecularTex;
sampler2D _NormalTex;
float _SpecularMapScale;
float _SpecShininess;
float _ColorDepth;
float4 _MainTex_ST;
float4 _NormalTex_ST;
float4 _SpecularTex_ST;
float _BumpFactor;
float _Gloss;
float _Cutoff;
float _StartCutoff;
float _EndCutoff;
struct v2f
{
float4 pos :SV_POSITION;
float4 col :TEXCOORD0;
float3 xyz :TEXCOORD1;
float2 uv:TEXCOORD2;
float2 uv_Normal:TEXCOORD3;
float2 uv_SpeTex:TEXCOORD4;
float3 lightDir : TEXCOORD5;
float3 normal : NORMAL;//法线向量坐标
};
v2f vert(appdata_full v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.xyz = v.vertex.xyz;
//OUT.posWorld = mul(_Object2World, IN.vertex);
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
o.uv_Normal = v.texcoord.xy * _NormalTex_ST.xy + _NormalTex_ST.zw;
o.uv_SpeTex = v.texcoord.xy * _SpecularTex_ST.xy + _SpecularTex_ST.zw;
//o.normal = v.texcoord.xy * _NormalTex_ST.xy + _NormalTex_ST.zw;
TANGENT_SPACE_ROTATION;
//ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
o.normal = mul(float4(v.normal, 0.0), unity_WorldToObject).xyz;
//o.normal = v.normal;
return o;
}
float4 frag(v2f i) : SV_TARGET
{
float4 albedo = tex2D(_MainTex, i.uv);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
//直接解出切线空间法线
float3 tangentNormal = UnpackNormal(tex2D(_NormalTex, i.uv_Normal));
//构建一个float3向量,用于与法线相乘得到更改后的法线值
float3 normalFactor = float3(_BumpFactor, _BumpFactor, 1);
//将factor与法线相乘并normalize
float3 normal = normalize(tangentNormal * normalFactor);
//normalize一下切线空间的光照方向
float3 tangentLight = normalize(i.lightDir);
//兰伯特光照
fixed3 lambert = saturate(dot(normal, tangentLight));
//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
//i.col = albedo;
float3 normalDirection = normalize(i.normal);
//获取入射光线的方向
float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
//获取视角方向
//float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.pos.xyz);
float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, i.xyz).xyz);
float3 specular;
fixed4 s = tex2D (_SpecularTex, i.uv_SpeTex);
//若是法线方向和入射光方向大于180度,镜面反射值为0
if (dot(normalDirection, lightDirection) < 0.0)
{
specular = float3(0.0, 0.0, 0.0);
}
//否则,根据公式进行计算 Specular =LightColor * SpecColor *pow(max(0,dot(R,V)),Shiness),R=reflect(-L,N)
else
{
float3 reflectDirection = reflect(-lightDirection, normalDirection);
//specular = _LightColor0.rgb * _SpecColor.rgb * pow(max(0.0, dot(reflectDirection, viewDirection))* _SpecShininess, _Gloss) ;
specular = _LightColor0.rgb * _SpecColor.rgb * pow(max(0.0, dot(reflectDirection, viewDirection))* _SpecShininess, _Gloss * pow(max(0.1, s.g)*2, _SpecularMapScale)) ;
//specular = _LightColor0.rgb * _SpecColor.rgb * (saturate(dot(reflectDirection, viewDirection))* _SpecShininess) ;
}
//fixed4 c = pow(tex2D (_MainTex, i.uv), _ColorDepth) * (pow( (0.2989 * s.r + 0.5870 * s.g + 0.1140 * s.b)* 3, _SpecularMapScale));
fixed4 c = pow(tex2D (_MainTex, i.uv), _ColorDepth) ;
//fixed4 c = pow(tex2D (_MainTex, i.uv), _ColorDepth) * ( (0.2989 * s.r + 0.5870 * s.g + 0.1140 * s.b)* _SpecularMapScale);
//fixed4 c = tex2D (_MainTex, i.uv);
//clip(c.a- _Cutoff);
//【4】合并漫反射、镜面反射、环境光的颜色值
float4 diffuseSpecularAmbient = float4(diffuse, 1.0)+ float4(specular, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
//float4 diffuseSpecularAmbient = float4(diffuse, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
//i.col = fixed4(diffuseSpecularAmbient * albedo.rgb + diffuse, 1.0);
i.col = fixed4(diffuseSpecularAmbient * c.rgb, 1.0);
//double v = Mathf.Asin(cha.x / Mathf.Sqrt(cha.x * cha.x + cha.y*cha.y)) / 3.1415926 * 360;
//float v = asin(i.xyz.x / sqrt(i.xyz.x * i.xyz.x + i.xyz.y * i.xyz.y)) / 3.1415926 * 180;
float vy = acos(i.xyz.y / sqrt(i.xyz.x * i.xyz.x + i.xyz.y * i.xyz.y)) / 3.1415926 * 180;
//float v = atan(i.xyz.x /i.xyz.y) / 3.1415926 * 180;
if(vy>= _StartCutoff && vy <=_EndCutoff && _Cutoff < 1.0)
i.col.a = _Cutoff;
//clip(i.col.a - _Cutoff);
return i.col;
}
ENDCG
}
}
FallBack "Diffuse"
//FallBack "Transparent/Cutout/VertexLit"
}
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "Custom/vertFragShader" {
Properties {
_Diffuse ("Diffuse", Color) = (1,1,1,1)
_SpecColor("SpecColor", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_SpecularTex ("Specular (RGB)", 2D) = "white" {}
_NormalTex ("Bump (RGB)", 2D) = "white" {}
_BumpFactor ("Bump Scale", Range(-10.0, 10.0)) = 0.0
_SpecularMapScale ("SpecularMapScale", Range(-10, 10)) = 0
_SpecShininess("Specular Shininess", Range(-10.3, 10.3)) = 2.0
_ColorDepth("ColorDepth", Range(-10.0, 10.0)) = 2.0
_Gloss("Gloss", Range(-10.0, 10.0)) = 4
_StartCutoff("StartCutoff", Range(-1, 181)) = 0
_EndCutoff("EndCutoff", Range(-1, 181)) = 0
_Cutoff("Cutoff", Range(0.0, 1.0)) = 1
}
SubShader {
Tags { "RenderType"="Transparent" "IgnoreProjector"="True" "Queue"="Transparent"}
Pass
{
Tags { "LightMode" = "ForwardBase"}
//ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
#include "HLSLSupport.cginc"
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
fixed4 _Diffuse;
//fixed4 _SpecColor;
sampler2D _MainTex;
sampler2D _SpecularTex;
sampler2D _NormalTex;
float _SpecularMapScale;
float _SpecShininess;
float _ColorDepth;
float4 _MainTex_ST;
float4 _NormalTex_ST;
float4 _SpecularTex_ST;
float _BumpFactor;
float _Gloss;
float _Cutoff;
float _StartCutoff;
float _EndCutoff;
struct v2f
{
float4 pos :SV_POSITION;
float4 col :TEXCOORD0;
float3 xyz :TEXCOORD1;
float2 uv:TEXCOORD2;
float2 uv_Normal:TEXCOORD3;
float2 uv_SpeTex:TEXCOORD4;
float3 lightDir : TEXCOORD5;
float3 normal : NORMAL;//法线向量坐标
};
v2f vert(appdata_full v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.xyz = v.vertex.xyz;
//OUT.posWorld = mul(_Object2World, IN.vertex);
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
o.uv_Normal = v.texcoord.xy * _NormalTex_ST.xy + _NormalTex_ST.zw;
o.uv_SpeTex = v.texcoord.xy * _SpecularTex_ST.xy + _SpecularTex_ST.zw;
//o.normal = v.texcoord.xy * _NormalTex_ST.xy + _NormalTex_ST.zw;
TANGENT_SPACE_ROTATION;
//ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
o.normal = mul(float4(v.normal, 0.0), unity_WorldToObject).xyz;
//o.normal = v.normal;
return o;
}
float4 frag(v2f i) : SV_TARGET
{
float4 albedo = tex2D(_MainTex, i.uv);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
//直接解出切线空间法线
float3 tangentNormal = UnpackNormal(tex2D(_NormalTex, i.uv_Normal));
//构建一个float3向量,用于与法线相乘得到更改后的法线值
float3 normalFactor = float3(_BumpFactor, _BumpFactor, 1);
//将factor与法线相乘并normalize
float3 normal = normalize(tangentNormal * normalFactor);
//normalize一下切线空间的光照方向
float3 tangentLight = normalize(i.lightDir);
//兰伯特光照
fixed3 lambert = saturate(dot(normal, tangentLight));
//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
//i.col = albedo;
float3 normalDirection = normalize(i.normal);
//获取入射光线的方向
float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
//获取视角方向
//float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.pos.xyz);
float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, i.xyz).xyz);
float3 specular;
fixed4 s = tex2D (_SpecularTex, i.uv_SpeTex);
//若是法线方向和入射光方向大于180度,镜面反射值为0
if (dot(normalDirection, lightDirection) < 0.0)
{
specular = float3(0.0, 0.0, 0.0);
}
//否则,根据公式进行计算 Specular =LightColor * SpecColor *pow(max(0,dot(R,V)),Shiness),R=reflect(-L,N)
else
{
float3 reflectDirection = reflect(-lightDirection, normalDirection);
//specular = _LightColor0.rgb * _SpecColor.rgb * pow(max(0.0, dot(reflectDirection, viewDirection))* _SpecShininess, _Gloss) ;
specular = _LightColor0.rgb * _SpecColor.rgb * pow(max(0.0, dot(reflectDirection, viewDirection))* _SpecShininess, _Gloss * pow(max(0.1, s.g)*2, _SpecularMapScale)) ;
//specular = _LightColor0.rgb * _SpecColor.rgb * (saturate(dot(reflectDirection, viewDirection))* _SpecShininess) ;
}
//fixed4 c = pow(tex2D (_MainTex, i.uv), _ColorDepth) * (pow( (0.2989 * s.r + 0.5870 * s.g + 0.1140 * s.b)* 3, _SpecularMapScale));
fixed4 c = pow(tex2D (_MainTex, i.uv), _ColorDepth) ;
//fixed4 c = pow(tex2D (_MainTex, i.uv), _ColorDepth) * ( (0.2989 * s.r + 0.5870 * s.g + 0.1140 * s.b)* _SpecularMapScale);
//fixed4 c = tex2D (_MainTex, i.uv);
//clip(c.a- _Cutoff);
//【4】合并漫反射、镜面反射、环境光的颜色值
float4 diffuseSpecularAmbient = float4(diffuse, 1.0)+ float4(specular, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
//float4 diffuseSpecularAmbient = float4(diffuse, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
//i.col = fixed4(diffuseSpecularAmbient * albedo.rgb + diffuse, 1.0);
i.col = fixed4(diffuseSpecularAmbient * c.rgb, 1.0);
//double v = Mathf.Asin(cha.x / Mathf.Sqrt(cha.x * cha.x + cha.y*cha.y)) / 3.1415926 * 360;
//float v = asin(i.xyz.x / sqrt(i.xyz.x * i.xyz.x + i.xyz.y * i.xyz.y)) / 3.1415926 * 180;
float vy = acos(i.xyz.y / sqrt(i.xyz.x * i.xyz.x + i.xyz.y * i.xyz.y)) / 3.1415926 * 180;
//float v = atan(i.xyz.x /i.xyz.y) / 3.1415926 * 180;
if(vy>= _StartCutoff && vy <=_EndCutoff && _Cutoff < 1.0)
i.col.a = _Cutoff;
//clip(i.col.a - _Cutoff);
return i.col;
}
ENDCG
}
}
FallBack "Diffuse"
//FallBack "Transparent/Cutout/VertexLit"
}