您的位置:首页 > 编程语言 > C语言/C++

<Shader>透明效果+纹理融合 vertex和fragment

2017-05-24 10:55 411 查看
shader "Custom/VertexFragment003"{
Properties{
_MainColor("Main Color:",color) = (1,1,1,1)
_MainTexture("Main Texture",2d) = "white" {}
_SpecularColor("Specular Color:",color) = (1,1,1,1)
_SpecularShininess("shininess Range",range(0,100)) = 10
}

SubShader{
pass
{
Tags{ "LightMode" = "ForwardBase" }

CGPROGRAM
#pragma vertex vert
#pragma fragment frag

float4 _LightColor0;
float4 _MainColor;
float4 _SpecularColor;
sampler2D _MainTexture;
float _SpecularShininess;

//顶点输入的信息
struct appData{
float4 vertex:POSITION;	//顶点的坐标
float3 normal:NORMAL;	//顶点的法向量
float2 texcoord:TEXCOORD0;	//一级纹理UV坐标
};

//顶点着色器输出的结构
struct v2f{
float4 pos:SV_POSITION; //顶点像素的位置
float3 normal:NORMAL;	//顶点法线的位置
float2 texure0:TEXCOORD0; //一级纹理的坐标
float4 worldPos:TEXCOORD1;	//在世界坐标中的位置
};

v2f vert(appData IN)
{
v2f OUT;
OUT.pos 	= mul(UNITY_MATRIX_MVP,IN.vertex);  //mvp的坐标
OUT.normal  = mul(float4(IN.normal,0.0),unity_ObjectToWorld).xyz;
OUT.worldPos =  mul(unity_ObjectToWorld,IN.vertex);
OUT.texure0  = IN.texcoord;  //输出的纹理就等于输入的纹理

return OUT;
}

float4 frag(v2f IN):COLOR
{
float4 textColor = tex2D(_MainTexture,IN.texure0);
//计算diffuse = MainColor * LightColor * max(0,dot(N,L))
float3 normalDirection = normalize(IN.normal);
float3 lightDiretion   = normalize(_WorldSpaceLightPos0.xyz);
float3 viewDirection   = normalize(_WorldSpaceCameraPos - IN.worldPos.xyz);

float3 diffuseColor;	//计算出 diffuse = maincolor * lightColor * max(0,dot(N,L))
float3 specularColor;  //specula = mainColor * specularColor * pow( max(0,dot(r,v)),shininess )  R = reflet(-N,L)

if (dot(normalDirection,lightDiretion) < 0.0){
diffuseColor = float3(0,0,0);
}
else{
diffuseColor = _MainColor.rgb * _LightColor0.rgb * max(0,dot(normalDirection,lightDiretion));
}

float3 reflectDirection = reflect(-normalDirection,lightDiretion);
specularColor = _MainColor * _SpecularColor * pow(max(0,dot(reflectDirection,viewDirection)),_SpecularShininess);

float4 finalColor = float4(diffuseColor,1.0) + float4(specularColor,1.0) + UNITY_LIGHTMODEL_AMBIENT;
//将漫反射 镜面反射  环境光 乘以纹理的颜色值  极为最终的颜色值。

return finalColor  * textColor;
}

ENDCG

}
}
FallBack "Diffuse"
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Shader Shader 入门 U3D c++