终于有空看点新东西,这一篇在《游戏编程精粹1》的5.3节中,主要讲通过烘焙前后左右4个方向光照并插值,来代替顶点光照的做法

看了下原文例程的代码,似乎是放在cpu部分处理的顶点色,或可能只是参考用的脚本

这种烘焙4个方向的做法或许优于顶点光照,但缺点是光线角度较为固定,原文描述早期的足球游戏有使用到

或许改成贴图的话可以烘焙进一些法线效果,或是做成粒子光照。。

优点

  • gpu上优于顶点光照
  • 可作为辅助光源使用
  • 较高的精度

缺点:

  • 消耗一定的cpu
  • 占用一块uv数据
  • 常规烘焙的情况下,只对俯视角、水平视角支持比较好

首先写一个简单的兰伯特光照,烘焙四个方向:

这4个方向的灯光信息会被烘焙到uv2,uv3中,运行后cpu计算当前角度的权重,到shader里进行混合。

插值的计算用了比较偷懒的做法,原文是转角度进行处理,由于y方向固定,这里直接用Vector2点乘。

public class LightingRuntime : MonoBehaviour
{public Transform virtualLight;public Color virtualLightCol;public SkinnedMeshRenderer testRenderer;void Update(){var lightDir = (virtualLight.position - transform.position).normalized;lightDir = Vector3.ProjectOnPlane(lightDir, Vector3.up);var lightDir_vec2 = new Vector2(lightDir.x, lightDir.z);var blend1 = Mathf.Clamp01(Vector2.Dot(lightDir_vec2, Vector2.up));var blend2 = Mathf.Clamp01(Vector2.Dot(lightDir_vec2, Vector2.down));var blend3 = Mathf.Clamp01(Vector2.Dot(lightDir_vec2, Vector2.left));var blend4 = Mathf.Clamp01(Vector2.Dot(lightDir_vec2, Vector2.right));var vec4 = new Vector4(blend1, blend2, blend3, blend4);testRenderer.material.SetVector("_TestLight", vec4);testRenderer.material.SetVector("_TestLightCol", virtualLightCol);}
}

传入4个权重代表4个方向,然后shader部分根据4个方向的权重乘起来即可。

可以用uv2,uv3来储存4个方向的光照信息。

v2f vert (appdata v)
{v2f o = (v2f)0;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.uv2 = v.uv2;o.uv3 = v.uv3;return o;
}fixed4 frag (v2f i) : SV_Target
{fixed4 lightVolume =  i.uv2.x *  _TestLight.x + i.uv2.y * _TestLight.y + i.uv3.x * _TestLight.z + i.uv3.y * _TestLight.w;return lightVolume * _TestLightCol;
}

但是占用uv2,uv3有点占用带宽,于是想了一个办法,左右和前后的方向可以各用一个镜像:

left = 1 - right;

用镜像之前需要记录4个方向,现在只需记录2个。但是要考虑一些长期阴影的区域,所以还需加些参数调节去缓解。

优化了一下,将uv2作为光照信息,并镜像了烘焙到顶点上的光照(输出的uv2是float4),以及微调参数:

v2f vert (appdata v)
{v2f o = (v2f)0;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.uv2.xz = v.uv2.xy;o.uv2.y = (1 - v.uv2.x) - 0.8;o.uv2.w = (1 - v.uv2.y) - 1;return o;
}fixed4 frag (v2f i) : SV_Target
{fixed lightVolume = dot(i.uv2, _TestLight);return lightVolume * _TestLightCol;
}

最终效果:

2019/06/2补充,增加一组面片的使用情况:

测试工程地址:

https://gitee.com/Hont/4DirBakeLighting

转载于:https://www.cnblogs.com/hont/p/10887615.html

游戏编程精粹学习 - 使用定点颜色插值模拟实时光照相关推荐

  1. 游戏编程精粹学习 - 一种快速的圆柱棱台相交测试算法

    在Unity中挂载Renderer的对象可以使用OnBecameVisible/OnBecameInvisible来接收剔除事件. 但是非Renderer对象则要自己处理相交检测. 文中的方法测试结果 ...

  2. 【D3D11游戏编程】学习笔记十一:基本几何体绘制

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 这次我们来学习几种常见的基本几何体的绘 ...

  3. 【D3D11游戏编程】学习笔记十八:模板缓冲区的使用、镜子的实现

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 模板缓冲区(Stencil Buffe ...

  4. 游戏编程精粹1-6分类目录之通用编程技术部分

    游戏编程精粹1-6分类目录之通用编程技术部分 ----------第一册------------------------- 第1章 通用编程技术 1.0 神奇的数据驱动设计(Steve Rabin) ...

  5. 【D3D11游戏编程】学习笔记九:编译Effect的方法

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在D3D11应用程序中,对于写好的Ef ...

  6. 游戏编程精粹 附带光盘

    精粹5源代码.rar 精粹7源代码.rar  游戏编程精粹:e53413c00081a010e(1).iso 游戏编程精粹:f33092a0004fd00ea.iso  游戏编程精粹:G898.2 T ...

  7. 【D3D11游戏编程】学习笔记七:3D渲染管线

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 3D图形学研究的基本内容,即给定场景的 ...

  8. Unity人工智能编程精粹学习笔记 实现AI角色的自主移动——操控行为

    目录 操控行为 操控行为编程的主要基类 个体AI角色的操控行为 群体的操控行为 个体与群体的操控行为组合 几种操控行为的编程解析 操控行为的快速实现 操控行为编程的其他问题 总结 源码工程下载链接 操 ...

  9. Unity人工智能编程精粹学习笔记 AI角色的复杂决策——行为树

    要让游戏里的AI角色能执行预设的逻辑,最直接的方法是依照行为逻辑直接编写代码,但是这种方法工作量大,也容易出错.我们也可以用有限状态机来实现行为逻辑,但是有限状态机难以模块化,编写代码麻烦且容易出错. ...

最新文章

  1. python导入txt文件并绘图-Python实现读取txt文件并画三维图简单代码示例
  2. 消息中间件(Kafka/RabbitMQ)收录集
  3. 五年级下册电子计算机与多媒体,语文人教版五年级下册《电子计算机与多媒体》.doc...
  4. 计算机二进制怎么转化成十六进制数是,6、计算机进制之二进制、十进制、十六进制之间的转换...
  5. Collectors.averagingLong()
  6. IT 行业加班到底有没有价值?
  7. 11gpath失败 oracle_win10安装oracle11g提示path长度不够,该怎样解决?
  8. 基于springboot的简易聊天系统
  9. 使用JS数组迭代方法渲染页面数据并实现查询功能
  10. 电子邮件是qq邮箱吗
  11. java拼图游戏难度怎么分级_拼图游戏有什么技巧吗?
  12. Pegasus读取传感器AD的值
  13. 1-系统C盘迁移到新买的固态硬盘SSD中有影响但不主要,但有必要将系统盘C盘迁移到新安装的 固态硬盘SSD中吗?
  14. 最近在读的一些文章-2019.1
  15. 第八章第一节:Java继承之继承概念、语法、成员访问和super关键字
  16. 关于免费的虚拟主机与虚拟主机的一些事情
  17. 读懂python语言_一文读懂python反射机制
  18. 【微信小程序】首行缩进、 去掉/取消首行缩进
  19. Unity技能系统框架(一)技能效果
  20. MOOC浙江大学陈月、何钦铭老师《数据结构》学习笔记01

热门文章

  1. 将Halcon导出的多个dxf文件合并成一个分图层的dxf文件
  2. 用一条mysql语句插入多条数据
  3. BZOJ 1295: [SCOI2009]最长距离 spfa
  4. 为什么到最后还是要 专注于博客写作
  5. 用sublime Text2来开发ruby on rails项目
  6. 【2011.9.29】得到明天的时间,得到明天某时刻和现在的时间差(毫秒)
  7. cocos2d-x-2.2中编译cocos2d-win32.vc2010.sln出现:C1083 pthread.h No such file or director错误的解决办法
  8. Sharding-JDBC读写分离_MySql主从配置(1)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记015
  9. STM32工作笔记0072---UCOSIII在STM32F103上的移植
  10. 2015年6月24日日报