SpecColor _Gloss _NormalTex _SpecularTex _Cutoff

来源:互联网 发布:香蕉网络电视tv 编辑:程序博客网 时间:2024/05/16 02:55
// 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"
}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有公主病的老婆怎么办? 圆通快递太慢了怎么办 美台军舰互停怎么办 安装包删除不掉怎么办 艾灸后皮肤极痒怎么办 拔罐如果有水泡怎么办 拔罐拔出水泡来怎么办 拔罐拔出了水泡怎么办 风湿引起的背疼怎么办 拔罐减肥不瘦怎么办 艾灸后脸上长痘怎么办 艾灸烟大怎么办 湿毛巾 月经推迟一个月了还不来怎么办 埋线了喝酒了怎么办 对待孩子脾气暴燥怎么办 买的新鞋子臭脚怎么办 鞋子臭脚怎么办如何除 惠普803墨盒干了怎么办 酷派手机无命令怎么办 华为手机锁机了怎么办 小孩被蜘蛛咬了怎么办 我是一个不爱说话的人怎么办 光动能手表停了怎么办 电波表收不到波怎么办 吃了壮阳药头疼怎么办 吃了伟哥后头痛怎么办 伟哥吃了不管用怎么办 钱站的钱还不起怎么办 面试工资要低了怎么办 线切割环保来查怎么办 喝白酒咽不下去怎么办 翠佛堂的玉假了怎么办 300英雄账号忘了怎么办 买了假酒不承认怎么办 买到假酒不承认怎么办 喝假酒胃里难受怎么办 怀孕初期塞药了怎么办 促黄体生成素高怎么办 激素脸痒的厉害怎么办 肾阴虚又肾阳虚怎么办 泡菜坛子太酸了怎么办