首页 > 分享 > UnityShader——Phong光照模型 = Diffuse + Specular + Ambient

UnityShader——Phong光照模型 = Diffuse + Specular + Ambient

一.图形学颜色叠加乘法(各分量相乘)

light(1, 1, 1) * stuff(0.2f, 0.3f, 0.5f) = (0.2f, 0.3f, 0.5f) 1 二.经验模型Phong

Phong = Ambient + Diffuse +Specular

1.Diffuse漫反射

Diffuse

Diffuse = dot ( -lightDir , N) * lightColor 这里点乘: dot( A , B) =|A| |B| Cos<A,B> ,所以夹角越小,diffuse越大; Diffuse 兰伯特光照模型:

Shader "Unlit/Lambert" {SubShader{Tags { "RenderType" = "Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float3 worldNormal:TEXCOORD0;float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);return o;}fixed4 frag (v2f i) : SV_Target{//法线Nfixed3 worldNormal = normalize(i.worldNormal);//光源方向LightDirfixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);//diffuse分量计算fixed3 diffuse = max(0.0, dot(worldNormal, -worldLightDir));//叠加光源色fixed3 diffuseColor = diffuse * _LightColor0.xyz;return fixed4(diffuseColor, 0);}ENDCG}} }

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

unity中diffuse漫反射效果

2.Specular镜面反射

Unity中加入Specular镜面反射

Specular = pow (max( 0 , dot(ReflectDir, ViewDir) ) , Glass) * lightColor; 反射方向用CG函数 reflect(L , N)计算; ViewDir = normalize( _WorldSpaceCameraPos.xyz - i.worldPos); //i为v2f

加入Specular之后的Shader:

Shader "Unlit/Phong" {Properties{_SpecularGlass("SpecularGlassStrength", Range(0,64))=32}SubShader{Tags { "RenderType" = "Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float3 worldNormal:NORMAL;float4 vertex : SV_POSITION;float3 worldPos : TEXCOORD1;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}float _SpecularGlass;fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 diffuse = max(0.0, dot(worldNormal, -worldLightDir));fixed3 diffuseColor = diffuse * _LightColor0.xyz;//计算reflect方向fixed3 reflectDir = normalize(reflect(worldLightDir, worldNormal));//计算view方向fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);//specular分量fixed3 specular = pow(max(0.0, dot(reflectDir, viewDir)), _SpecularGlass);fixed3 specularColor = specular * _LightColor0.xyz;return fixed4(diffuseColor + specularColor, 0);}ENDCG}} }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 3.Ambient环境光

环境光之间获取 乘上叠加物体颜色;

//环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _ObjColor; 12

给一个Obj颜色之后:
在这里插入图片描述

相关知识

Shader(六) 高光 Phont 和 BlinnPhone 光照模型案例
OpenGl光照之材质
OpenGL(七) 光照模型及设置
Direct3D研究院之光照、材质(七)
OpenGL中光照的设置
Shader(五) 逐顶点 逐像素 和 Lambert 光照模型案例
计算机图形学 Phong光照模型实验(OpenGL的基本使用)
基于预计算的实时环境光照(Real
Cesium中光照效果的实现与调整
Gazebo仿真中光源的设置

网址: UnityShader——Phong光照模型 = Diffuse + Specular + Ambient https://m.huajiangbk.com/newsview1356250.html

所属分类:花卉
上一篇: 茉莉花对光照要求高吗?
下一篇: 铜钱草的光照要求是什么? 爱问知