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