日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习笔记——基本光照模型简单实现

發布時間:2025/3/17 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记——基本光照模型简单实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Lambert光照模型,根據光照向量與頂點發現的夾角來確定光照強度:

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));// 紋理色 * 光源色 * 強度參數c = c * _LightColor0 * diffuse;return c * 2;}ENDCG}} FallBack "Diffuse" }

Phong光照模型,根據光照向量的反射向量與視線的夾角來計算鏡面高光的強度,另外再加上漫射光的成分:

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;// 紋理色 * 光源色 * 強度參數c = c * _LightColor0 * (diffuse + specular);return c * 2;}ENDCG}} FallBack "Diffuse" }

BinnPhong光照模型,根據光照向量和視線的半角向量,與頂點法線的夾角來計算鏡面高光的強度,另外再加上漫射光的成分:

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;// 紋理色 * 光源色 * 強度參數c = c * _LightColor0 * (diffuse + specular);return c * 2;}ENDCG}} FallBack "Diffuse" }

BinnPhong比Phong少計算一次反射向量,會更簡潔和高效。

總結

以上是生活随笔為你收集整理的学习笔记——基本光照模型简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。