上周美术同学在使用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问题的更多相关文章

  1. 第一个Unity3D脚本

    学习就该简单粗暴,看了一天Unity3d的教程加文档,尝试一个小练习,再快速写个博客加深印象. 一:首先建立一个空白工程,创建一个空GameObject,在Assets Pannel中创建一个名为Le ...

  2. 分享一个Unity3D小作品,源码地址已公布在文章开头!

    Update:回复量有点大,楼主工作期间可能无暇向童鞋们发送源码,为了不让童鞋们久等,现公布源码地址.  链接: http://pan.baidu.com/s/1sjpYW4d 密码: zhp9 请注 ...

  3. 我的第一个unity3d Shader, 很简单,基本就是拷贝

    Shader "Castle/ColorMix" { Properties { // 基本贴图 _MainTex ("Texture Image", 2D) = ...

  4. 简单实现一个Unity3d的Timer

    数量使用的不太多,没有实现对象池. using System.Collections; using System.Collections.Generic; using UnityEngine; usi ...

  5. PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例

    前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...

  6. Unity3D移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑 ...

  7. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  8. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  9. 用DropBox分享Unity3D的Web应用

    用U3D做好游戏好想分享给亲朋好友体验怎么办?导出exe,apk都可以,只是下载始终是个门槛. 幸好还可以导出web版(虽然要安装unity3d的插件),但自己没有服务器怎么办,没关系~,现 在是云时 ...

随机推荐

  1. dede手机端首页点击文章内容、列表,却跳到pc端

    手机访问到手机端首页,点击列表.内容.图片等都跳到pc端,是什么原因? 查看m模板里面的index.html文件生成的代码是绝对路径(数字随机)13.html 而不是view.php?aid=13 解 ...

  2. java_IO_装饰器

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  3. 在WEB项目中调用QQ通讯组件打开QQ聊天界面

    在很多WEB项目中,需要提供在线服务的功能,加上自己的联系方式,例如:QQ,不用添加QQ好友也可以交谈,那这到底是怎么实现的呢? 对于这个功能,需要提到一个组件,即“QQ通讯组件”.QQ通讯组件是一种 ...

  4. uploadify的简单使用

    简单的图片上传: 1.进入官网下载uploadify插件:http://www.uploadify.com/download/ 2.导入uploadify插件提供的css样式和类库: <link ...

  5. 【转载】eclipse设置护眼色详细教程

    先上一张效果图:     下面开始设置: 首先设置代码区的背景色: Window–>preference-->General-->Editors-->Test Editors ...

  6. UVA - 10410 Tree Reconstruction(栈处理递归)

    题目: 给出一棵树的BFS和DFS序列,输出这棵树中每个结点的子结点列表.BFS和DFS序列在生成的时候,当一个结点被扩展时,其所有子结点应该按照编号从小 到大的顺序访问. 思路: 一开始是想根据BF ...

  7. linux more-显示文件内容,每次显示一屏

    博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作.more名单中 ...

  8. ch12 GUI

    <Head First Java 2nd Edition> 摘录 JFrame 代表屏幕上的一个窗口,可以把 buttons, checkboxes, test fields 等等界面相关 ...

  9. 洛谷 1712 BZOJ 4653 [NOI2016]区间

    [题解] 先把区间按照未离散化的长度排序,保存区间长度,然后离散化区间端点.每次把区间覆盖的点的覆盖次数加1,如果某个点被覆盖次数大于等于m,就从前往后开始删除区间直到没有一个点被覆盖的次数大于等于m ...

  10. 在centos7中使用yum安装mysql数据库并使用navicat连接

    1.安装 1.查看yum列表,发现没有mysql [root@server-mysql src]# yum list mysql 已加载插件:fastestmirror Repodata is ove ...