您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页Phong光照模型的Shader实现

Phong光照模型的Shader实现

来源:飒榕旅游知识分享网
Phong光照模型的Shader实现

计算反射向量

Phong⽤到的是反射向量,计算反射向量的公式是R = 2*N(dot(N, L)) - L

这个公式是根据向量的投影公式以及平⾏四边形法则推导出来的详细步骤请看这篇⽂章,讲的⾮常好

Shader \"Phong\"{

Properties {

_MainTex (\"Texture\ {} _Specular(\"Specular\1, 20)) = 1 _SpecColor(\"SpecColor\1,1,1,1) }

SubShader {

Tags { \"RenderType\"=\"Opaque\" } LOD 100

Pass {

CGPROGRAM

#pragma vertex vert #pragma fragment frag #include \"UnityCG.cginc\" struct v2f {

float2 uv : TEXCOORD0;

float4 vertex : SV_POSITION; float3 normal : TEXCOORD1; float3 lightDir : TEXCOORD2; float4 objPos : TEXCOORD3; };

sampler2D _MainTex; float4 _MainTex_ST; float4 _LightColor0; float _Specular; float4 _SpecColor;

v2f vert (appdata_full v) {

v2f o;

o.objPos = v.vertex;

o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); o.normal = v.normal;

o.lightDir = ObjSpaceLightDir(v.vertex);//把光向量从世界空间转成模型空间 return o; }

fixed4 frag (v2f i) : SV_Target {

float3 L = normalize(i.lightDir); float3 N = normalize(i.normal);

float3 viewDir = normalize(ObjSpaceViewDir(i.objPos));//计算出视线

float diff = saturate(dot(L, N));

float3 reflection = normalize(2.0 * N * diff - L);//反射向量

float spec = pow(max(0, dot(reflection, viewDir)), _Specular); float3 finalSpec = _SpecColor.rgb * spec; //漫反射+镜⾯⾼光+环境光

float3 finalLight = diff * _LightColor0 + finalSpec + UNITY_LIGHTMODEL_AMBIENT; fixed4 col = tex2D(_MainTex, i.uv); return col * float4(finalLight, 1); }

ENDCG } }}

Blinn-phong光照模型

blinn是⼀个⼈的名字,他叫吉姆·布林,图形学界的⼤⽜,他发现了使⽤半⾓向量代替反射向量的计算⽅式原理是通过视线向量跟光向量的半⾓向量代替反射向量halfVector = normalize( L + V );

http://blog.csdn.net/herox25000/article/details/50491483

在图形学中,计算光照模型时,经常需要求取反射向量,⼀般的shader函数库都提供计算反射向量的⽅法,下⾯介绍⼀下如何⼿动计算反射向量。

给定⼊射光线向量I和平⾯法向量N,求反射向量R,如下图。为了⽅便计算,这⾥假定I和N都是单位向量(模为1,编程时可先将I和N单位化)

⽅法⼀

设⼊射光线向量I和反射平⾯的法向量N之间的夹⾓为theta。连接I的始端和R的末端,则有R = 2P - I (1)

现在问题变成了如何求取P,设⼊射点0到P与N的交点的向量为S,那么有P = I + S (2)

现在问题变成了如何求取向量S,向量S即向量-N(注意,这⾥是-N,因为S和N的⽅向相反。)在向量N上的投影,根据公式有因为N是单位向量,简化⼀下得到

将S代⼊公式(2),再将P代⼊公式(1)得到

⽅法⼆

将R平移⼀下,与向量N的延长线相交。

由于⼊射⾓和反射⾓相等,且I和R的长度也相等,所以三⾓形ION是等腰三⾓形。故有ON = 2S所以有R = I + 2S

⽽S是-I在N上的投影,所以有由于N是单位向量,简化⼀下得到所以

貌似⽅法⼆更直观些。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务