一,多个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. 引用Interop.SQLDMO.dll后的注意事项。

    SQLDMO.dll是个好东西,ASP.NET利用它可以实现在线备份.还原数据库等各种功能.近日有客户要求为其在后台添加一个管理数据库的功能.于是就出现了这篇文章.     由于客户的数据库和WEB服 ...

  2. Adventures in Functions

    速度还行,两天看完一章,就是有细节没去扣.书上的大部分知识点和代码都看了,这个还是可以的. 今天继续来学习函数的高级特性,要涉及到以下的主题. 内联函数(inline function) 引用变量(r ...

  3. Mongo分区后分片下count记录不准确

    问题描述 问题如图,后来上网查了一下,发现了这是正常现象: 官方文档解释了这种现象的原因以及解决方法: 不准确的原因: 操作的是分片的集合(前提): shard分片正在做块迁移,导致有重复数据出现 存 ...

  4. <聪明的投资者(第四版点评)>读书笔记

    书在这里 企业的内在价值并不依赖于其股票价格 投资者的最大问题甚至最可怕的敌人,很可能就是他们自己 投资者不能指望通过买任何新股或“热门”股,而获得优于平均水平的收益.从长远来看,这几乎无疑会产生相反 ...

  5. centosmini7安装GNOME

    1.在命令行下输入下面的命令来安装 Gnome 包 #:$sudo  yum groupinstall "GNOME Desktop" "Graphical Admini ...

  6. SpringMVC @SessionAttributes 使用详解以及源码分析

    @sessionattributes @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Docum ...

  7. MSXML4 SP2 sp3安装时出错

    没有启动Windows Module Installer 服务或者windows installer服务,重启试试 Windows Installer Cleanup Tool清理早期的在选项框中找到 ...

  8. 使用jquery将表单元素转json提交后台

    今天帮朋友解决一个问题,朋友的框架用的layui的,发现layui的里面的data.field不能获取动态生成的标签的值的. 于是使用jquery的方法如下: var formObject = {}; ...

  9. vba的一个DB操作类

    Option Explicit '-------------------------------------------------------- '[Class Name]: DBHelper '[ ...

  10. 回顾:maven配置和常用命令整理

    推荐两个库地址,开源中国的好像不好使了 阿里的仓库:http://maven.aliyun.com/nexus/content/groups/public/ 另一个:http://repo2.mave ...