一个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的值乘上更大的比例。
一个unity3d lightmap问题的更多相关文章
- 第一个Unity3D脚本
学习就该简单粗暴,看了一天Unity3d的教程加文档,尝试一个小练习,再快速写个博客加深印象. 一:首先建立一个空白工程,创建一个空GameObject,在Assets Pannel中创建一个名为Le ...
- 分享一个Unity3D小作品,源码地址已公布在文章开头!
Update:回复量有点大,楼主工作期间可能无暇向童鞋们发送源码,为了不让童鞋们久等,现公布源码地址. 链接: http://pan.baidu.com/s/1sjpYW4d 密码: zhp9 请注 ...
- 我的第一个unity3d Shader, 很简单,基本就是拷贝
Shader "Castle/ColorMix" { Properties { // 基本贴图 _MainTex ("Texture Image", 2D) = ...
- 简单实现一个Unity3d的Timer
数量使用的不太多,没有实现对象池. using System.Collections; using System.Collections.Generic; using UnityEngine; usi ...
- PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...
- Unity3D移动平台动态读取外部文件全解析
前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑 ...
- Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生
一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- 用DropBox分享Unity3D的Web应用
用U3D做好游戏好想分享给亲朋好友体验怎么办?导出exe,apk都可以,只是下载始终是个门槛. 幸好还可以导出web版(虽然要安装unity3d的插件),但自己没有服务器怎么办,没关系~,现 在是云时 ...
随机推荐
- Android基础TOP5_1:AutoCompleteTextView自动补全文本框
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- Tcl之Math
expr is for Tcl to do math operations. It takes all of its arguments ("2 + 2" for example) ...
- python学习笔记(4)——list[ ]
发现个问题,python与C.JAVA等语言相比学习障碍最大差别居然在于版本更迭!这是python官方造的虐啊... 有时针对某问题去google答案,或者自己去博客找共性解答,会出现相互矛盾或者与你 ...
- CPU位数、操作系统位数、机器字长、C/C++基本数据类型长度
1.CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度: //现在的计算机处理器一般都是64位,这是硬件的事. 2.CPU为了实现其功能设计了指令集,即是CPU的 ...
- js继承的方式
深入理解继承的实现方式不仅仅有利于自己去造轮子,封装插件,更有利于我们去阅读一些框架的源码, 以下记录几种常见的继承方式 1. 原型链实现继承 function Father(){ this.name ...
- 批量生成随机字符串并保存到excel
需要导入jxl.jar,commons-lang-2.6.jar 链接:https://pan.baidu.com/s/1NPPh24XWxkka68x2JQYlYA 提取码:jvj3 链接:http ...
- vue启动
首先在终端terminal连上npm 镜像库 npm config set registry https://registry.npm.taobao.orgnpm installnpm run loc ...
- 数列分块入门1-9 By hzwer
声明 持续更新,因为博主也是正在学习分块的知识,我很菜的,菜的抠$jio$ 写在前面 分块是个很暴力的算法,但却比暴力优秀的多,分块算法的时间复杂度一般是根号的,他的主要思想是将一个长度是$n$的数列 ...
- [luogu3573 POI2014] RAJ-Rally (拓扑排序 权值线段树)
传送门 Solution 在DAG中我们可以\(O(n)\)预处理\(Ds(u)\)表示从u表示以s为起点的最长路\(Dt(u)\)表示以u为终点的最长路,那么经过\((u,v)\)的最长路即为\(D ...
- linux初步学习有感
经过了一段时间对linux的接触,从最开始接触到的deepin到后来我最喜欢的KaliLinux,感受到了这个我曾经并不了解的操作系统的独特魅力. 我是到了大学才知道linux这个系统的,但是在小时候 ...