一,多个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. git将一个分支的某个文件合并到当前分支

    有时在开发的feature中,整个分支的功能并没有完成开发完成,但是,有几个修改的基础文件需要合并到develop中,这个时候的操作步骤为: git checkout develop     //切换 ...

  2. 【MySql 】is not allowed to connect to this MySql server 无法访问远程MySQL数据库

    问题:访问远程MySQL数据库时报错[is not allowed to connect to this MySql server ]不允许访问,因为MySQL默认只有本机localhost能够访问M ...

  3. Gojs简单例子

    前台代码: <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> ...

  4. XXXXX

    http://www.java-gaming.org/topics/laser-fx-opengl-libgdx/25402/view.html Libgdx游戏引擎之Dialog组件 http:// ...

  5. Jquery函数大全 - 案例说明

    function(){$(this).addClass(”out”);}); toggle( fn, fn ) 如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二 ...

  6. 引用dataframe的值为什么会不同

    在R语言中,通常有一些操作符可以来提取对象的子集,如以下三种: 1.“[” 单层方括号,返回的对象与原对象类型相同,它也可以返回一个对象中的多个元素: 2.“[[” 双层方括号,用来从列表(list) ...

  7. Should I expose synchronous wrappers for asynchronous methods?

    In a previous post Should I expose asynchronous wrappers for synchronous methods?, I discussed " ...

  8. 自然语言交流系统 phxnet团队 创新实训 项目博客 (七)

    在本项目中使用到的“语音转文本”的技术总结: 语音转文本部分是调用的科大讯飞的在线语音,它的激发方式是按键,通过按钮触发开启安卓设备的录音,此部分需要在源码中写入关于安卓权限的要求,来调用安卓的录音权 ...

  9. 接口、抽象类、泛型、hashMap

    看到hashMap的put方法的第一行代码就懵逼了 就不继续往下看了 用简单的代码还原第一行代码 TsInter.java 接口 为什么要使用接口,比如写文章一样,我先列个大纲 //interface ...

  10. php时间段判断

    <?php function times(){ ini_set('date.timezone','Asia/Shanghai'); $time = date("Y-m-d H:i&qu ...