学习笔记——基本光照模型简单实现
生活随笔
收集整理的這篇文章主要介紹了
学习笔记——基本光照模型简单实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Lambert光照模型,根據(jù)光照向量與頂點發(fā)現(xiàn)的夾角來確定光照強度:
Shader "James/VP Shader/LightModel-Lambert" {Properties {_MainTex ("MainTex", 2D) = "white" {}}SubShader {Pass{Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _LightColor0;sampler2D _MainTex;float4 _MainTex_ST;struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 lightDir : TEXCOORD1;float3 normal : TEXCOORD2;};v2f vert(appdata_full v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);// 從頂點位置到Light的局部向量o.lightDir = ObjSpaceLightDir(v.vertex);o.normal = v.normal;return o;}float4 frag(v2f i) : COLOR{i.lightDir = normalize(i.lightDir);i.normal = normalize(i.normal);// 紋理采樣float4 c = tex2D(_MainTex, i.uv);// 光強度,法向和光照方向的cos值float diffuse = max(0, dot(i.normal, i.lightDir));// 紋理色 * 光源色 * 強度參數(shù)c = c * _LightColor0 * diffuse;return c * 2;}ENDCG}} FallBack "Diffuse" }Phong光照模型,根據(jù)光照向量的反射向量與視線的夾角來計算鏡面高光的強度,另外再加上漫射光的成分:
Shader "James/VP Shader/LightModel-Phong" {Properties {_MainTex ("MainTex", 2D) = "white" {}_gloss ("Gloss", Float) = 1}SubShader {Pass{Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _LightColor0;sampler2D _MainTex;float4 _MainTex_ST;float _gloss;struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 normal : TEXCOORD1;float3 lightDir : TEXCOORD2; // 光照方向float3 reflectLightDir : TEXCOORD3; // 光照反射方向float3 viewDir : TEXCOORD4; // 視線方向 };v2f vert(appdata_full v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);o.normal = v.normal;// 從頂點位置到light的局部向量o.lightDir = ObjSpaceLightDir(v.vertex);// 反射向量,注意需要使用-o.lightDiro.reflectLightDir = reflect(-o.lightDir, v.normal);// 視線,頂點到camera的局部變量o.viewDir = ObjSpaceViewDir(v.vertex);return o;}float4 frag(v2f i) : COLOR{i.normal = normalize(i.normal);i.reflectLightDir = normalize(i.reflectLightDir);i.viewDir = normalize(i.viewDir);// 紋理采樣float4 c = tex2D(_MainTex, i.uv);// 漫射光強度float diffuse = max(0, dot(i.normal, i.lightDir));// 鏡面光強度float specular = max(0, dot(i.reflectLightDir, i.viewDir));specular = pow(specular, 32) * _gloss;// 紋理色 * 光源色 * 強度參數(shù)c = c * _LightColor0 * (diffuse + specular);return c * 2;}ENDCG}} FallBack "Diffuse" }BinnPhong光照模型,根據(jù)光照向量和視線的半角向量,與頂點法線的夾角來計算鏡面高光的強度,另外再加上漫射光的成分:
Shader "James/VP Shader/LightModel-BinnPhong" {Properties {_MainTex ("MainTex", 2D) = "white" {}_gloss ("Gloss", Float) = 5}SubShader {Pass{Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _LightColor0;sampler2D _MainTex;float4 _MainTex_ST;float _gloss;struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 normal : TEXCOORD1; float3 lightDir : TEXCOORD2; // 光照方向 };v2f vert(appdata_full v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);o.normal = v.normal;// 頂點->light的局部向量o.lightDir = ObjSpaceLightDir(v.vertex);// 頂點->camera的局部向量float3 viewDir = ObjSpaceViewDir(v.vertex);return o;}float4 frag(v2f i) : COLOR{i.lightDir = normalize(i.lightDir);i.normal = normalize(i.normal);// 半角向量,光照方向和視線的中間值float3 halfDir = (i.lightDir + i.normal) * 0.5;// 紋理采樣float4 c = tex2D(_MainTex, i.uv);// 漫射光強度float diffuse = max(0, dot(i.normal, i.lightDir));// 鏡面光強度float specular = max(0, dot(i.normal, halfDir));specular = pow(specular, 32) * _gloss;// 紋理色 * 光源色 * 強度參數(shù)c = c * _LightColor0 * (diffuse + specular);return c * 2;}ENDCG}} FallBack "Diffuse" }BinnPhong比Phong少計算一次反射向量,會更簡潔和高效。
總結
以上是生活随笔為你收集整理的学习笔记——基本光照模型简单实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】 67_经典问题分析 五
- 下一篇: 在 CSS 中,width 和 heig