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

Shader基于顶点编程的Lambert光照,Phong光照和Blinn-Phong光照

2015-12-18 09:36 405 查看
Lambert光照模型(环境光+漫反射):

Shader "Custom/ShaderLambert" {

SubShader {
Pass{
CGPROGRAM

#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag

struct params{
float4 Pos:POSITION;
float4 Col:COLOR;
};

params vert(appdata_base ab)
{
params pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT;       //环境光

float3 N;
float3 L;
//求法向量
//N = normalize(UnityObjectToWorldNormal(ab.normal));   //系统自带UnityObjectToWorldNormal:将模型法向量转换到世界

N = normalize(ab.normal);     //自行处理法向量
N = mul(float4(N,0),_World2Object).xyz; //由于此处存在法向量非等比转换问题,故需要将法向量乘以它的逆转矩阵,如右侧

//求光向量
//L = normalize(WorldSpaceLightDir(ab.vertex));        //系统自带WorldSpaceLightDir:传入顶点求世界方向的光向量

L = normalize(_WorldSpaceLightPos0);    //自行处理光向量,此处用mul,因为法向量和光向量变其中一个让他们统一就行

float DotNL = saturate(dot(N,L));           //计算漫反射夹角

pms.Col += _LightColor0 * DotNL;      //环境光+漫反射

return pms;

}

float4 frag(params INPUT):COLOR
{
return INPUT.Col;
}

ENDCG
}
}
}


Phong光照模型(环境光+漫反射+镜面高光):

Shader "Custom/ShaderPhong_Vertex" {
Properties{
_SpecularColor("SpecularColor",color) = (1,1,1,1)
}
SubShader {
Pass{
CGPROGRAM

#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag

float4 _SpecularColor;

struct parmas{
float4 Pos:POSITION;
float4 Col:COLOR;
};

parmas vert(appdata_base ab)
{
parmas pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT;    //环境光

float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
float3 L =normalize(WorldSpaceLightDir(ab.vertex)).xyz;

float DotNL = saturate(dot(N,L));    //转化为[0,1]之内

pms.Col = pms.Col+_LightColor0 * DotNL;    //环境光 + 漫反射

//通过Reflect 获取反射光线
float3 R = normalize(reflect(-WorldSpaceLightDir(ab.vertex),N));  //使用reflect() 其中光源要指向顶点
//float3 R = normalize(2*dot(N,L)*N-L);    //手动求反射R
float3 V = normalize(WorldSpaceViewDir(ab.vertex));

float DotRV = max(0,dot(R,V)+0.1);    //此处保留

pms.Col = pms.Col*0.8+_SpecularColor*DotRV*0.1;   //环境光+漫反射+镜面反射高光

return pms;
}

float4 frag(parmas INPUT):COLOR
{
return INPUT.Col;
}
ENDCG
}
}
}


Blinn-Phong光照模型(环境光+漫反射+半角镜面高光):

Shader "Custom/ShaderBlinnPhong_Vertex" {
Properties{
_SpcularColor("SpecularColor",color) = (1,1,1,1)
}
SubShader {
Pass{
CGPROGRAM

#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag

float4 _SpcularColor;

struct parmas
{
float4 Pos:POSITION;
float4 Col:COLOR;
};

parmas vert(appdata_base ab)
{
parmas pms;

pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT;   //环境光

float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
float3 L = normalize(WorldSpaceLightDir(ab.vertex)).xyz;
float DotNL = saturate(dot(N,L));

pms.Col = pms.Col + _LightColor0*DotNL;   //环境光 + 漫反射

//求半角向量
float3 BJ = normalize(L + normalize(WorldSpaceViewDir(ab.vertex)));

float DotLBJ = saturate(dot(BJ,N));

pms.Col = pms.Col*0.8 + pow(_SpcularColor*DotLBJ*0.6,4);   //环境光 + 漫反射 + 镜面反射高光

return pms;
}

float4 frag(parmas INPUT):COLOR
{
return INPUT.Col;
}

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