您的位置:首页 > 移动开发 > Unity3D

Unity3d《Shader篇》漫反射

2015-06-23 15:42 501 查看
Unity3d《Shader篇》漫反射

Shader "Custom/Ambient" {

Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color("Diffuse Material Color", Color) = (1,1,1,1)
_SpecColor("Specular Color", Color) = (1,1,1,1)
_Shininess("Shininess", Float) = 10
}

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

CGPROGRAM

#pragma exclude_renderers gles

#pragma vertex vert
#pragma fragment frag

sampler2D _MainTex;

uniform float4 _Color;
uniform float4 _SpecColor;
uniform float _Shininess;

uniform float4 _LightColor0;

struct vertexInput
{
float2 texCoord : TEXCOORD0;
float4 vertex : POSITION;
float3 normal : NORMAL;
};

struct vertexOutput
{
float4 pos : SV_POSITION;
float4 color : COLOR;
float2 texCoord : TEXCOORD0;
};

vertexOutput vert( vertexInput input )
{
vertexOutput output;
float4x4 modelMatrix = _Object2World;

float3 normalDir = normalize(float3(mul(_Object2World, float4(input.normal,0.0))));
float3 lightDir = normalize(float3(_WorldSpaceLightPos0));
float3 viewDir = normalize(_WorldSpaceCameraPos - float3(mul(_Object2World,input.vertex)));

float specularRefection = float3(_LightColor0)*float3(_SpecColor)*pow(max(0.0,dot(reflect(-lightDir,normalDir),viewDir)),_Shininess);
float3 diffuseReflection = float3(_LightColor0)*float3(_Color)*max(0.0,dot(normalDir,lightDir));

float3 ambientLighting = float3(UNITY_LIGHTMODEL_AMBIENT)*float3(_Color);

output.color = float4(ambientLighting+diffuseReflection+specularRefection,1.0);
output.pos = mul(UNITY_MATRIX_MVP,input.vertex);
output.texCoord = input.texCoord;

return output;

}

float4 frag(vertexOutput input) : COLOR
{
float4 col = tex2D(_MainTex,input.texCoord)*_Color;
return input.color*col;

}

ENDCG
}
}

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