环境光 = 环境光颜色 乘以 环境光强度
float3 ambient = _LightColor0 * _AmbientStrength
漫反射 = 光线入射方向 点乘 法线方向 ,再乘以 漫反射光颜色 乘以 漫反射光强度
float3 diff = dot(i.normal, _WorldSpaceLightPos0) * _LightColor0 * _DiffStrength
高光 = 摄像机(观察)方向 点乘 反射光方向 , 再求这个值的 x次方 , x是高光系数 (决定了高光的聚集)。最后再乘以 高光颜色 ,乘以 高光强度 。
反射光方向 = 入射光 和 法线 方向,求反射方向。
float3 reflectDir = reflect(-_WorldSpaceLightPos0, i.normal)
float3 spec = pow(max(dot(i.viewDir, reflectDir),0.0), _SpecPow) * _LightColor0 * _SpecStrength
在Phone光照模型的基础上,仅有一点区别。
在计算高光时,将反射光与摄像机(观察)方向的夹角, 改为了发现方向与 摄像机(观察)方向和入射方向的中间向量的夹角 。
相同条件下Blinn-Phong的高光范围袭备要比Phong更大,写实效果Phong光照模型更好。但算法简单, 运行速度快是Blinn-Phong光照模型的优点 。
Shader "Unlit/LightShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
拍纳毁 _AmbientStrength("Ambient Strength", Range(0,1.0)) = 0.1
_DiffStrength("Diff Strength", Range(0,1.0)) = 0.1
_SpecPow("Spec Pow", Range(0,100)) = 10
_SpecStrength("Spec Strength", Range(0,1.0)) = 0.1
_Brightness("Brightness", Range(0,5)) = 1
}
SubShader
{
Tags { "LightMode"="ForwardBase" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "UnityLightingCommon.cginc"
struct appdata
{
float4 vertex : POSITION
float2 uv : TEXCOORD0
float3 normal : NORMAL
}
struct v2f
茄悉 {
float2 uv : TEXCOORD0
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION
float3 normal : NORMAL
float3 viewDir : TEXCOORD1
}
sampler2D _MainTex
float4 _MainTex_ST
float _AmbientStrength
float _DiffStrength
float _SpecPow
float _SpecStrength
float _Brightness
v2f vert (appdata v)
{
v2f o
o.vertex = UnityObjectToClipPos(v.vertex)
// o.uv = v.uv
o.uv = TRANSFORM_TEX(v.uv, _MainTex)
o.normal = UnityObjectToWorldNormal(v.normal)
o.viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz)
UNITY_TRANSFER_FOG(o,o.vertex)
return o
}
fixed4 frag (v2f i) : SV_Target
{
float4 baseColor = tex2D(_MainTex, i.uv)
// ambient
float3 ambient = _LightColor0 * _AmbientStrength
//diffuse
float3 diff = dot(i.normal, _WorldSpaceLightPos0) * _LightColor0 * _DiffStrength
//specular
float3 reflectDir = reflect(-_WorldSpaceLightPos0, i.normal)
float3 spec = pow(max(dot(i.viewDir, reflectDir),0.0), _SpecPow) * _LightColor0 * _SpecStrength
//final color
fixed4 col = float4((spec + diff + ambient), 1.0) * baseColor * _Brightness
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col)
return col
}
ENDCG
}
}
}
内容如下:1、 Phong、Blinn-Phong光照模型是一种简单光照模型,它仅考虑了光源直接照射的效果,没有考虑非直接光照的效果。如下直接光照与间接光照。
2、上述模型在考虑间接光此碰唯照(环境光)时,采用的是一个常数来表示,因此存在一吵闭定的局限性。全局光照模拟(Global illumination,GI)= 直接光照 + 间接光照。为了实时计算光照,引入了很多间接光照的计算方法,光线跟踪算法,考虑了光滑表面对环境光的反射和森培折射。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)