SpecColor _Gloss _NormalTex _SpecularTex _Cutoff

// 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"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值