一,多个WaterProDaytime不要公用material。

原因是:水面material的shader(FXWaterPro.shader)引用了reflectionTexture,而水面1的reflectionTexture是由水面1的reflectionCamera渲染出来的。水面2的reflectionTexture是由水面2的reflectionCamera渲染出来的。由于水面1的reflectionCamera与水面2的reflectionCamera的观察方向不同,所以必须用两个不同的camera,所以得到的reflectionTexture也是不同的,那么如果水面1和水面2的material用同一个,它们的shader引用的reflectionTexture就只能是同一个,这与水面1与水面2的reflectionTexture不同相矛盾,所以水面1和水面2必须用不同的matrial。(用refractionTexture来分析也是一样)。(如果好奇多个水面使用同一个matrial会发生什么,可以做一下试验,结果就是当摄像机旋转到某个角度时水面的reflection和refraction效果会发生奇怪的跳变)。

如果我们要在场景中同时添加两个Water,正确的做法是:

(1)由WaterProDaytime.prefab创建两个实例Water1和Water2。

(2)将WaterProDaytime.mat复制出两个副本,WaterProDaytime1.mat和WaterProDaytime2.mat。

(3)用WaterProDaytime1.mat替换Water1原来的material,用WaterProDaytime2.mat替换Water2原来的material。

同理,即使场景中只放一个Water,也应该将WaterProDaytime.mat复制一个副本替换原来的material,以避免原prefab的material被污染。

二,WaterProDaytime在Orthographic相机上的bug。

对于Orthographic相机,如果water在视截体内且water平面与相机视线平行,unity将报出“Screen position out of view frustum”这个error。报错行是Water.cs脚本中的reflectionCamera.Render(),但经过分析可以确定是reflectionCamera.projectionMatrix = cam.CalculateObliqueMatrix(clipPlane)这一句导致的,更具体地说是unity的Camera.CalculateObliqueMatrix这个API的实现有bug/对Orthographic相机支持不完善/根本就不支持Orthographic?亦或是Camera.CalculateObliqueMatrix正确完成了自己的计算,但Camera.Render()中对于Camera.CalculateObliqueMatrix的特殊情况下的计算结果没有作出正确的理解。

Camera.CalculateObliqueMatrix(clipPlane)在文档中的解释是:

Calculates and returns oblique near-plane projection matrix.

Given a clip plane vector, this function returns camera's projection matrix which has this clip plane set as its near plane.

(关于obliqueMatrix还可以参考:

http://forum.unity3d.com/threads/problem-camera-calculateobliquematrix.252916/

http://www.terathon.com/code/oblique.html

http://aras-p.info/texts/obliqueortho.html

http://www.terathon.com/lengyel/Lengyel-Oblique.pdf)

也就是说,oblique投影矩阵与普通投影矩阵(透视投影矩阵和正交投影矩阵)的差别是:普通投影矩阵所描述的视截体近平面与锥轴垂直,而oblique投影矩阵所描述的视截体近平面是斜的(与锥轴不垂直)。

如下图所示,左图中红色的是透视投影视截体,右图中红色的是oblique投影视截体。由于水面是反射面,所以渲染反射图象时必须以视截体被水面所截的截面作为视口,即“斜视口”,所以必须将反射相机转化成oblique投影模式。reflectionCamera.projectionMatrix = cam.CalculateObliqueMatrix(clipPlane)就是干这个事儿。

不过对于一些特殊情况,得不到有限的 斜视口 ,如下两图:

   

上面左图是透视投影下得不到有限斜视口的例子,右图是正交投影下得不到斜视口的例子。

不过对WaterProDaytime进行测试我发现在其在透视投影相机下总是不会报error的(至少我没测到反例),这说明Camera.CalculateObliqueMatrix在透视投影下还是工作良好而且Camera.Render能正确理解Camera.CalculateObliqueMatrix的计算结果。但对于正交投影相机,经过测试,如上面右图所示,当water与锥轴平行且在h1之下或在h2之上时安全,但在h1和h2之间时会报error。

由于这是unity自已API的问题,完美的解决只能等官方修正。

但work around是有的,就是:

(1)把Water.cs中的

reflectionCamera.Render();

改成:

if(cam是正交投影相机&&视线与本水面平行){

  reflectionCamera.Render();

}

(2)把Water.cs中的

refractionCamera.Render();

改成:

if(cam是正交投影相机&&视线与本水面平行){

  refractionCamera.Render();

}

三,WaterProDaytime不能在cubemap中反射。

如下图,其中动态cubemap球体用下面日志中的方法做的:http://www.cnblogs.com/wantnon/p/4480727.html

当球体的Camera_cubeMapRealTime的Culling Mask选为“除Water外所有物体”,效果如下:

但是当球体的Camera_cubeMapRealTime的Culling Mask选为Everything,效果变成:

显然是不正常的。原因我还不清楚。

unity, WaterProDaytime注意事项。的更多相关文章

  1. Unity 软件使用事项

    打开旧版工程 目前发现两种方式来触发升级程序: 1.Unity软件启动时选择旧版工程,触发更新 2.直接打开旧版工程的场景文件,触发更新   在使用中发现一种错误做法,不知道是不是共性问题,在此先记录 ...

  2. unity 美术注意事项

    有时候美术的一个不小心,就会给程序徒增极大的工作量,所以在项目开始之前是有必要和美术沟通一下,来规范一些东西, 1.将单体模型的轴心置中. 2.模型有父物体时,子物体应相对于父物体的(0,0,0)位置 ...

  3. unity, Destroy注意事项

    Destroy不是立即发生作用,而是推迟到帧末,所以下面代码是错误的: void OnTriggerEnter(Collider other){   if (other.gameObject.tag  ...

  4. Unity AnimatorController注意事项

    通过assetbundle加载的单独打包AnimatorController使用下面方法赋值 Go.GetComponent<Animator>().runtimeAnimatorCont ...

  5. Unity3D开发注意事项

    最近给组里定Unity开发注意事项,参考了@陆泽西在群里分享的[前端开发规范],结合自己工作中的经验,整理一下,下面不少条款都是我们要求在开发中必须遵守的. 资源: 图片统一为png格式,纹理属性:T ...

  6. VR/AR 非技术总结

    VR/AR 非技术总结 **欢迎转载~转载请注明Erma的博客 http://www.cnblogs.com/Erma-king/** 都说2016是VR/AR的元年,上半年我随着新技术的潮流进入了V ...

  7. Enterprise Library:Unity的几个注意事项

    背景 在.Net平台中,几乎所有的Ioc容器在注册方面都不一致,使用Unity需要注意几个事项,咱们通过实验进行验证一下. 验证的内容: 集合的获取. 生命周期管理. 实验 代码 1 using Sy ...

  8. Unity中Shader和AssetBundle结合使用的注意事项

    之前遇到了一件事情就是打包安卓的ab后,unity在editor启动下,加载出来的abshader丢失,其实发布安卓后运行是正常的,当时还纠结了半天,还写了个重新赋值的脚本 下面是unity开发的一些 ...

  9. unity, Additive Animtion注意事项

    以下摘自官方文档:(http://docs.unity3d.com/Manual/AnimationScripting.html) Additive animations allow you to o ...

随机推荐

  1. BMP位图文件格式详解及编程建议

    BMP文件渊源流长,虽然对JPG.PNG等格式图像文件来说,确实有点土,但是毕竟BMP文件格式相对简单,容易理解,至于BMP众多的位图格式也不能责怪微软,主要是早期谁也没料到图片技术会发展的这么快,而 ...

  2. Postgres快速创建大量测试数据

    DROP TABLE IF EXISTS color; CREATE TABLE color( cname ), remark ) ); ),) ,); 插入10000000数据之后,用时51秒 对于 ...

  3. SecureCRT ,可是进入模拟器后TAB键还是无法补全

    SecureCRT是做网络,路由,交换机等设备的人都知道的工具 ,可是进入模拟器后TAB键还是无法补全,就很懊恼了. 设置步骤: 1)打开SecureCRT软件,选项—全局选项—常规—默认的会话设置— ...

  4. Charles proxy tools 移动开发调试

    简介 本文为InfoQ中文站特供稿件,首发地址为:文章链接.如需转载,请与InfoQ中文站联系. Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯 ...

  5. hive之案例分析(grouping sets,lateral view explode, concat_ws)

    有这样一组搜索结果数据: 租户,平台, 登录用户, 搜索关键词, 搜索的商品结果List {"tenantcode":"", "platform&qu ...

  6. android开发(37) android使用android_serialport_api 操作串口,解决权限问题

    最近有个项目,要使用android设备操作串口的 斑马GK888T打印机,使用打印机打印二维码. 硬件设备连接方式: 安卓设备 通过 串口RS232 连接 斑马打印机的串口 那么就要解决:使用安卓设备 ...

  7. 深入浅出学习Hibernate框架(二):JDBC基础操作

    上篇博客<深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架>简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate.这篇博客将介绍JD ...

  8. Sword pcre库函数学习一

    0.pcre_exec 原型: #include <pcre.h> int pcre_exec(const pcre *code, const pcre_extra *extra, con ...

  9. C++中内存泄漏的几种情况

    1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数 两种情况下会出现这种内存泄露:一是在堆里创建了对象占用了内存,但是没有显示地释放对象占用的内存:二是在类的构造函数中动态的分配了 ...

  10. HBase Rowkey的散列与预分区设计

    转自:http://www.cnblogs.com/bdifn/p/3801737.html 问题导读:1.如何防止热点?2.如何预分区?扩展:为什么会产生热点存储? HBase中,表会被划分为1.. ...