前置:UnityGI2:Lightmaps

一、实时 GI

字面意思,实时计算间接光照,设置与代码修改如下:

1. LightSetting 里面开启 Realtime Lighting,并将对应的主光源 Mode 设置为 Realtime

2. 修改 Shader 代码,和之前 Lightmap 采样一样,不过这次采样 dynLightmap,也就是动态光照贴图:MetaPass 的代码可以参考《UnityGI2:Lightmaps》这一章的第三节

struct appdata
{float4 vertex: POSITION;float3 normal: NORMAL;                  //法线float4 tangent: TANGENT;                //切线float2 uv: TEXCOORD0;                   //uv坐标#if defined(LIGHTMAP_ON)float2 lightmapUV: TEXCOORD1;           //光照贴图uv坐标#endif#if defined(DYNAMICLIGHTMAP_ON)float2 dynLightmapUV: TEXCOORD2;        //动态光照贴图uv坐标#endif
};//……
v2f vert(appdata v)
{//……#if defined(LIGHTMAP_ON)o.lightmapUV = v.lightmapUV * unity_LightmapST.xy + unity_LightmapST.zw;#endif#if defined(DYNAMICLIGHTMAP_ON)o.dynLightmapUV = v.dynLightmapUV * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;#endif
}//……
fixed4 frag(v2f i): SV_Target
{//……float3 indirectDiffuse = 0;#if defined(LIGHTMAP_ON)float3 defIndirectDiffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, i.lightmapUV));#if defined(DIRLIGHTMAP_COMBINED)float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, i.lightmapUV);defIndirectDiffuse = DecodeDirectionalLightmap(defIndirectDiffuse, lightmapDirection, normal);#endifindirectDiffuse += defIndirectDiffuse;#endif#if defined(DYNAMICLIGHTMAP_ON)float3 dynIndirectDiffuse = DecodeRealtimeLightmap(UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, i.dynLightmapUV));#if defined(DIRLIGHTMAP_COMBINED)float4 dynLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, i.dynLightmapUV);dynIndirectDiffuse = DecodeDirectionalLightmap(dynIndirectDiffuse, dynLightmapDirection, normal);#endifindirectDiffuse += dynIndirectDiffuse;#endif#if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON)indirectDiffuse += max(0, ShadeSH9(float4(normal, 1)));#endif
}

此时调整主光源的大小、亮度和方向,可以看到效果(包括间接光)也会实时变化:

可以通过调整光源的 indirect lighting 属性调整间接光的亮度:

支持多光源,但是不支持烘焙点光源和聚光灯的间接光阴影

二、光探针代理体

动态物体的间接光是通过光照探针来获取的,运行时会判断物体的中心在哪4个光照探针连成的区域内,并从这些探针获取光照数据,如果一个动态物体过大,就不能只拿动态物体的中心点作为参照了,否则物体上将不会有间接光过渡的效果

使用光探针代理体

1. 检查 Project Setting → Graphics 中是否支持使用光探针代理体,除此之外,这对硬件也有一定的要求,如果硬件和设置都支持,在 Shader 中 UNITY_LIGHT_PROBE_PROXY_VOLUME 宏就会被启用

2. 给对应的过大的动态物体对象添加 LightProbeProxyVolume 组件,组件参数可以参考 U3D 官网,这里就不再多介绍了,同时别忘了还要设置物体 MeshRender 组件上的 Light Probes 属性

3. 修改 Shader 代码如下:单个对象是否使用 LPPV 由 unity_ProbeVolumeParams 的 x 向量指示,该组件在 UnityShaderVariables 中定义,除此之外,核心代码在内置方法 ShadeSHPixel 中,具体可以参考 UnityStandardUtils.cginc 文件

#if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON)#if UNITY_LIGHT_PROBE_PROXY_VOLUMEif (unity_ProbeVolumeParams.x == 1){float3 LPPVDiffuse = max(0, ShadeSHPerPixel(float4(normal, 1), 0, i.posWorld));indirectDiffuse += LPPVDiffuse;}elseindirectDiffuse += max(0, ShadeSH9(float4(normal, 1)));#elseindirectDiffuse += max(0, ShadeSH9(float4(normal, 1)));#endif
#endif

搞定:

参考文章:

  • https://catlikecoding.com/unity/tutorials/rendering/part-18/
  • https://docs.unity3d.com/cn/current/Manual/class-LightProbeProxyVolume.html
  • https://docs.unity3d.com/cn/current/Manual/LODForBakedGI.html

UnityGI5:实时 GI 与光探代理体相关推荐

  1. 【转载收藏】Unity预计算实时GI

    初步介绍 新年假期结束了,想不想掌握一个新技能迎接全新的一年呢?不妨来阅读一下Unity预计算实时GI系列文章.本文是该系列的第一篇. 在Unity中有两种区别很大的技术被用于计算全局光照GI或光源反 ...

  2. [笔记]光照系统 实时GI、烘焙GI

    实时GI ●所谓"实时"是指在运行期间任意修改光源,而所有的变化可以立即更新. ●正式由于Unity 5 引入了行业领先的实时全局光照技术Enlighten系统,才可以在运行时产生 ...

  3. 渲染18——实时GI

    https://catlikecoding.com/unity/tutorials/rendering/part-18/ 参考网址:https://docs.unity3d.com/Manual/GI ...

  4. unity-光照实时GI(Realtime GI)

    实时GI可以提前预计算减少实时渲染时的计算压力,下面直接操作示例: (1)搭建场景:1个plane,2个cube,俩material放cube上,修改右侧cube颜色为红色,场景中的灯默认是RealT ...

  5. 鼠标控制两台台式机_台式机和控制台上的真棒实时GI

    鼠标控制两台台式机 We've teamed up with Alex Lovett again and built The Courtyard, a demo that puts the Preco ...

  6. IAT:实时完成暗光增强, 曝光矫正的超轻量级Transformer网络

    作者丨信息门下奶狗@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/535695807 编辑丨极市平台 导读 本工作提出了一种超轻量级的快速照明自适应Transform ...

  7. Unity预计算全局实时GI(六) - UV展开与减少光照图数量

    由于现在我们已经从光照预计算中排除了合适的对象物体,我们可以进行减少剩余光照图表数量的工作了. 因为生成光照图表(Charts)是为了包裹静态网格渲染器(Static Mesh Renderer)的光 ...

  8. Unity预计算全局实时GI(gi params)

    Unity提供许多进阶的光照贴图控制方法,这些设定被放在一个光照参数集(LightmapParameters)的资源里,好让设定能在不同的项目场景或是透过版本控制和团队一起共享. 要建立一个Light ...

  9. Unity实时GI与烘焙GI

    在Unity2019.3.8中,当我们新建一个场景时,默认的灯光设置为: 自带的主平行光:Realtime 灯光面板:Baked GI -> Light Mode为ShadowMask(不是Di ...

最新文章

  1. 利用栈的特性,将十进制数转换成八进制数
  2. Linux下的摄影后期处理软件
  3. pytorch nms 放大缩小
  4. exchange离线整理数据库
  5. python归一化sklearn_用sklearn进行对数据标准化、归一化以及将数据还原详解
  6. 分金币 Uva 11300
  7. 表达能力VS只会敲代码(2018届毕业生web前端)
  8. 创业公司用 Serverless,到底香不香?
  9. 程序员求助:被领导强行要求写Bug该怎么办?网友的回答让我笑翻
  10. 如何去掉 WinCE 4.2 的桌面墙纸
  11. Service,测试
  12. Qt5.2.1 + VS2010安装错误(Unable to find a Qt build)
  13. php随机生成卡密,PHP随机生成不重复的8位卡号(数字)和卡密(字符串)
  14. 前端Svelte框架初体验
  15. Java实现蓝桥杯历届试题格子刷油漆
  16. 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记1
  17. H5页面WebView在iPhoneX的适配
  18. 数字信号与模拟信号的区别(转载)
  19. Linux下Samba服务器配置,已成功
  20. Sigar获取系统信息

热门文章

  1. python入门经典-Python入门经典书籍有哪些?有这三本就够了
  2. micropython和python区别-MicroPython入坑记(三)板子上的Python到底有多快?
  3. python入门经典代码-【python】编程语言入门经典100例--12
  4. python必背入门代码-python学习必备知识汇总
  5. kaldi 语音识别
  6. 基于LD3320的嵌入式语音识别系统设计
  7. php7异常抛出的好处,PHP7的错误与异常
  8. elementui el-radio-group 分组排序问题
  9. 【数据结构和算法笔记】二叉树和树/森林的相互转换
  10. 怎么调用新建模型里文章的内容_读完这篇文章,再难的建筑模型你都能快速上手...