上周美术同学在使用unity3d制作lightmap的过程中,发现部分被lightmap影响的模型在移动端上效果与pc端不一致。当时我大概看了下,分析后,得到一个结论是“在移动端上lightmap的hdr格式转换到ldr格式后,着色时没有进行tonemap的还原”。因此效果就是曝光度>1的部分,最多只能显示出原本模型diffuse贴图的色调,而不是达到曝光的色调。所以当时我给出的解决办法就是将hdr->ldr转换时的压缩比列得到,最后在shader采样出ldr光照贴图后使用这个比例值还原hdr的效果。当然具体怎么做,还必须参考unity3d内部的要求。

  到了本周,得知进展不大。于是自己深入了解了一下unity3d的shader。

  unity3d的shader其实是广义上的,包含了部分render state的描述,具体可以使用三种描述方式:

  <1> surface shader:它是untiy3d的一种shader描述脚本,其作用就是通过untiy3d定义好的描述语法,将引擎内部已经实现好了的着色代码组合起来。从而简化了大量重复代码的书写,以及屏蔽一些具体的3d图形实现细节。我们可以理解为这是一种傻瓜式的shader。

  <2> vertex and fragment shaders:普通的着色语言,hlsl,cg,glsl等。

  <3> fixed function shader:一种描述脚本,用来操作固定管线的state。

  如果要解决上面这个问题,第一步我们需要得到hdr->ldr的比例。虽说unity3d lightmap烘焙使用的是beast,但是具体这个比例是多少,存放在哪里,这些细节无法查到。似乎引擎封装了它,但没有暴露出来。好在它提供了DecodeLightmap这个函数来还原,这个函数内部在移动端和gles下将亮度*2,在pc端下将亮度*8*light_alpha通道。这样看来在pc端下,ldr的还原程度更高,有8的亮度值,而移动端只有2。第二步就是将这个函数计算的还原值作为lightmap的亮度值*diffuse贴图就可以了。

  由于在移动端只有2倍,因此当烘焙时灯光强度大于2时,还是有问题。这时可以通过一些简单的tone map算法对light map的值进行一些调整,使其尽可能达到美术想要的效果。最简单的方式就是将lightmap的灰度调低,然后在shader中对lightmap的值乘上更大的比例。

最新文章

  1. iOS - Json解析精度丢失处理(NSString, Double, Float)
  2. java_method_数据去重
  3. inndb存储引擎调优
  4. 可维护的javascript
  5. BZOJ2432 [Noi2011]兔农
  6. 重新理解:ASP.NET 异步编程(转)
  7. 6.python字符串-内置方法列举
  8. Spring(3.2.3) - Beans(2): 属性注入 &amp; 构造注入
  9. 浮点数精确表示,java陷阱
  10. 账户管理命令 useradd、groupadd
  11. chinaOS
  12. VC6.0调试大全
  13. JQuery 限制文本框只能输入数字和小数点
  14. 原生JS实现音乐播放器!
  15. easyui datagrid 排序问题
  16. Github最流行的10,000个Java项目使用的类库
  17. AngulaJs -- 隔离作用域
  18. 杂项:GIT (分布式版本控制系统)
  19. 在jsp中,page指令的()属性用来引入需要的包或类。
  20. 关于mybatis中一级缓存和二级缓存的简单介绍

热门文章

  1. js this 和 event 的区别
  2. python的机器学习之路
  3. opencv总结
  4. v形 加强版
  5. python自动化--语言基础线程、生产者消费者示例
  6. Pro ASP.NET Core MVC 6th 第三章
  7. python学习笔记(6)——字典(Dictionary)
  8. vue-router + axios token登录状态认证
  9. Number 数据类型
  10. Python-组合数据类型