文章图片
一篇多年前翻译的技术文章 , 算是上一篇 shader 文章的补充 。
光照模型是用来决定模型表面光线的方法/算法 。 有许多利用着色器(shader)计算光照的方法 。 美术人员和程序员基于模型的真实程度/风格化程度/导入表现力来选择使用光照模型 。 下面我们会提到几个光照和着色模型 。
Lambert
Lambertian 反射率 , 或者扩散光 , 是应用中最普遍的光照模型之一 , 但让不是最最普遍的 。
这个光照模型独立出现 , 也就是说表面的亮度不会随着视点角度而改变 。 这是一个非常简单的模型 , 可以使用下面的伪代码( pseudocode )实现:
float3 SurfaceColor;//objects color
float3 LightColor;//lights color * intensity
floatLightAttenuation;//value of light at point (shadow/falloff)
floatNdotL=max(0.0,dot(normalDirection,lightDirection));
floatLambertDiffuse=NdotL*SurfaceColor;
float3 finalColor =LambertDiffuse*LightAttenuation*LightColor;
文章图片
文章图片
Half-Lambert(扩散包裹 Diffuse Wrap)
Half-Lambert 光照模型最初是由 Valve 开发用在初代半条命中的技术 。 用来皮面物体后部变形而且看上去不立体 。 这是一个极其宽容的光照模型 , 也正因如此 , 此模型完全不具有物理特性 。
Half-Lambert 光照模型的关键在于 ,Lambert 扩散除以 2, 然后加上 0.5 然后再二次方 。 一种常见的插入方式 , 称作扩散包裹( diffuse wrap ) , 不是使用 0.5, 而是你可以使用 0.5 到 1 之间的所有数值 , 基于这样的理念运作 。 比如说 , 不用:
pow(NdotL*0.5+0.5,2)
而还可以使用:
pow(NdotL*wrapValue +(1-wrapValue),2)
包裹数值可以是介于 0.5 到 1 之间的所有值 。
下面是 Half-Lambert 光照模型的一个插入方式:
float3 SurfaceColor;//objects color
float3 LightColor;//lights color * intensity
floatLightAttenuation;//value of light at point (shadow/falloff)
floatNdotL=max(0.0,dot(normalDirection,lightDirection));
floatHalfLambertDiffuse=pow(NdotL*0.5+0.5,2.0)*SurfaceColor;
float3 finalColor =HalfLambertDiffuse*LightAttenuation*LightColor;
文章图片
文章图片
Phong 光照
Phong 着色模型通常用来产生镜面效果 。 此函数基于这样的假设:表面反射的光是粗糙表面的漫反射和光滑表面的镜面反射的集合 。
下面是 Phong 模型的一个常见插入方式:
float3 viewDirection =normalize(_WorldSpaceCameraPos.xyz -i.posWorld.xyz);
float3 lightReflectDirection =reflect(-lightDirection,normalDirection );
floatNdotL=max(0,dot(normalDirection,lightDirection ));
floatRdotV=max(0,dot(lightReflectDirection,viewDirection ));
//Specular calculations
float3 specularity =pow(RdotV,_SpecularGloss/4)*_SpecularPower*_SpecularColor.rgb ;
float3 lightingModel =NdotL*diffuseColor +specularity;
floatattenuation =LIGHT_ATTENUATION(i);
float3 attenColor =attenuation *_LightColor0.rgb;
float4 finalDiffuse =float4(lightingModel*attenColor,1);
文章图片
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
