Unity如何实现动态光源的GI

Unity如何实现动态光源的GI,第1张

Unity的光照系统中光照包括直接光照、间接光照、环境光和反射光

直接光照:光源对于模型的光照。

间接光照:光线在其他模型上的反射所带来的光照。

环境光照:天空盒的颜色。

反射光:光线照射到模型上反射回来的光。

Unity中有两种不同的技术用于预计算照明、反射光。分别是Precomputed Realtime GI 和 Baked GI。

GI

GI的全称global illumination,全局光照。

在windows ->lighting中可以打开设置面板。

Precomputed Realtime GI

预计算实时光照,针对实时静态模型之间的光照信息。

Realtime Resolution:预计算实时光照将场景分成许多的texel(纹素)这个值控制了每个单位有几个texel,它对于模型间的反射光的质量有着很大的影响,但是随着增大也会带来更大的计算量。通常的来说如果是人密集且走动的村庄内这个值设置为2 – 3之间、村庄外设置为0.5 – 1之间。

CPU Usage:游戏中计算这些光照信息时CPU的占用率,分成low、medium、high、unlimited 4个挡位。

Baked GI

能得到更精确的模型之间的反射光信息,但是不能在游戏运行时实时的变动相应的光源信息,如颜色、方向。

这里要注意,如果要使用Baked GI,我们要为需要被烘焙光照信息的模型设置为Lightmap Static。选中模型然后在Inspector面板中点击右上角的Static的下拉列表选中Lightmap Static。

场景开始时自动创建的主光源:Directional Light。在这个物体的<Light>组件面板中可以改变光照强度等参数

环境光:选项卡栏 Window>Rendering>Lighting,之后d出界面,选择environment,修改Environment>Environment Reflections>Intensity Multiplier可以改变环境光强度

太阳光通常用Directional Light来表现。

十四讲我们实现了基本的Surface Shader,十五讲讲了光照模型的基础知识。这一讲说的是如何写光照模型。

自定义光照模型主要分为4步:

(0)架设框架,填写需要的参数

(1)计算漫反射强度

(2)计算镜面反射强度

(3)结合漫反射光与镜面反射光

代码配有中文注释,配合上上讲的光照公式,一步一步实现即可。

//

Author: 风宇冲

Shader "Custom/T_customLightModel" {

Properties

{

_MainTex ("Texture", 2D) = "white" {}

}

Subshader

{

//alpha测试,配合surf中的o.Alpha = c.a

AlphaTest Greater 0.4

CGPROGRAM

#pragma surface surf

lsyLightModel

//命名规则:Lighting接#pragma suface之后起的名字

//lightDir :点到光源的单位向量

viewDir:点到摄像机的单位向量

atten:衰减系数

float4 LightinglsyLightModel(SurfaceOutput s, float3 lightDir,half3 viewDir, half atten)

{

float4 c

//(1)漫反射强度

float diffuseF = max(0,dot(s.Normal,lightDir))

//(2)镜面反射强度

float specF

float3 H = normalize(lightDir+viewDir)

float specBase = max(0,dot(s.Normal,H))

// shininess 镜面强度系数,这里设置为8

specF = pow(specBase,8)

//(3)结合漫反射光与镜面反射光

c.rgb = s.Albedo * _LightColor0 * diffuseF *atten + _LightColor0*specF

c.a = s.Alpha

return c


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11765947.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存