Phong和Blinn-Phong光照模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Phong和Blinn-Phong光照模型相关的知识,希望对你有一定的参考价值。
参考技术A 光照 = 环境光 + 漫反射 + 高光环境光 = 环境光颜色 乘以 环境光强度
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
以上是关于Phong和Blinn-Phong光照模型的主要内容,如果未能解决你的问题,请参考以下文章
一步步学Metal图形引擎9-《Blinn-Phong光照模型》
一步步学Metal图形引擎9-《Blinn-Phong光照模型》
Unity shader学习之Blinn-Phong光照模型
shader编程-RayMarching与Blinn-Phong光照模型搭建三维场景(WebGL-Shader开发基础08)