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

Cg per-vertex lighting

2015-10-15 17:32 274 查看
Shader "Custom/Cg per-vertex lighting"
{
Properties
{
_Color("Diffuse Material Color",Color) = (1,1,1,1)
_SpecColor("Specular Material Color",Color)=(1,1,1,1)
_Shininess("Shininess",Float) = 10
}
SubShader
{
Pass
{
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM

#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"
uniform float4 _LightColor0;

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

struct vertexInput
{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct vertexOutput
{
float4 pos:SV_POSITION;
float4 col:COLOR;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;

float3 normalDirection = normalize(mul(float4(input.normal,0.0),modelMatrixInverse).xyz);
float3 viewDirection = normalize(_WorldSpaceCameraPos - mul(modelMatrix,input.vertex).xyz);
float3 lightDirection;
float attenuation;

if(0.0==_WorldSpaceLightPos0.w)
{
attenuation = 1.0;
lightDirection = normalize(_WorldSpaceLightPos0.xyz);
}
else
{
float3 vertexToLightSource = _WorldSpaceLightPos0.xyz - mul(modelMatrix,input.vertex).xyz;
float distance = length(vertexToLightSource);
attenuation = 1.0/distance;
lightDirection = normalize(vertexToLightSource);
}

float3 ambientLighting = UNITY_LIGHTMODEL_AMBIENT.rgb*_Color.rgb;
float3 diffuseReflection =  attenuation * _LightColor0.rgb * _Color.rgb * max(0.0,dot(normalDirection,lightDirection));

float3 specularReflection ;
if(dot(normalDirection,lightDirection)<0.0)
{
specularReflection = float3(0.0,0.0,0.0);
}
else
{
specularReflection = attenuation * _LightColor0.rgb * _SpecColor.rgb * pow(max(0.0,dot(reflect(-lightDirection ,normalDirection),viewDirection)),_Shininess);
}

output.col = float4(ambientLighting + diffuseReflection + specularReflection, 1.0);
output.pos = mul(UNITY_MATRIX_MVP,input.vertex);

return output;
}

float4 frag(vertexOutput input):COLOR
{
return input.col;
}
ENDCG
}
Pass
{
Tags { "LightMode" = "ForwardAdd" }
Blend One One

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float4 _LightColor0;

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

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

struct vertexOutput
{
float4 pos:SV_POSITION;
float4 col:COLOR;
};

vertexOutput vert(vertexInput input)
{
vertexOutput output;

float4x4 modelMatrix = _Object2World ;
float4x4 modelMatrixInverse = _World2Object;

float3 normalDirection = normalize(mul(float4(input.normal,0.0),modelMatrixInverse).xyz);
float3 viewDirection = normalize(_WorldSpaceCameraPos - mul(modelMatrix,input.vertex).xyz);
float3 lightDirection;
float attenuation;
if(0.0==_WorldSpaceLightPos0.w)
{
attenuation = 1.0;
lightDirection = normalize(_WorldSpaceLightPos0.xyz);
}
else
{
float3 vertexToLightSource = _WorldSpaceLightPos0.xyz - mul(modelMatrix,input.vertex).xyz;
float distance = length(vertexToLightSource);
attenuation = 1.0/distance;
lightDirection = normalize(vertexToLightSource);
}
float3 diffuseReflection = attenuation * _LightColor0.rgb * _Color.rgb * max(0.0,dot(normalDirection,lightDirection));
float3 specularReflection;
if(dot(normalDirection,lightDirection)<0.0)
{
specularReflection = float3(0,0,0);
}
else
{
specularReflection = attenuation * _LightColor0.rgb *_SpecColor.rgb * pow(max(0.0,dot(reflect(-lightDirection,normalDirection),viewDirection)),_Shininess);
}
output.col = float4(diffuseReflection + specularReflection,1.0);
output.pos = mul(UNITY_MATRIX_MVP,input.vertex);
return output;
}
float4 frag(vertexOutput input):COLOR
{
return input.col;
}
ENDCG
}
}
FallBack  "Specular"
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息