裸睡的鱼 发表于 2012-12-30 21:47

Unity3D如何实现反射教程二



Camera refractionCamera;

CreateWaterObjects( cam, out refractionCamera );

//这里创建了一个DontSave的Rtt和HideAndDontSave的Cam。
//为什么不直接使用场景里的观察cam呢? 个人理解u3d中的cam指定rtt后,将不在渲染当前场景到backBuffer。

疑问:如果只是把折射Rtt相机初始化成和观察相机一样,为什么要用Hashtable?并且如果去掉hide标志,每选中一次观察相机都会在创建出一个折射Rtt相机,不清楚这是为什么。




refractionCamera.cullingMask = ~(1<<4) & m_RefractLayers.value;

//1(二进制0000 0001)左移四位等于16(二进制0001 0000)

//16取非等于-17(二进制1110 1111)

//-17与运算-1等于-17(二进制1110 1111)

备注:为什么在water层中的物体不会被渲染到折射Rtt,答案就在这里。在有些engine里没有layer的概念,所以一般都是手动去显示和隐藏的,本质上是一回事。

这里也可以使用自己的层,例如定义layer8为yty并排除,就是~(1<<8) & m_RefractLayers.value。
要同时保留4和8,就是二进制的10001000,也就是272 &m_RefractLayers.value。
要同时排除4和8,则是 ~(272 &m_RefractLayers.value);

更多延伸link




其他的部分就和反射是一样的了,这里在补充下之前没提到的部分。

void OnWillRenderObject()
如果有物体可见,每个相机都会调用此函数。在裁剪过程中调用,也就是裁剪物体之前。可以用这个来创建具有依

赖性的渲染纹理,只有在被渲染的物体可见时才更新该渲染纹理。

备注:个人认为等同于其他engien的PreRenderCallbacks ()。

void OnDisable()
当对象变为不可用或非激活状态时此函数被调用。
当物体被销毁时它将被被调,并且用于任何清理代码。当脚本在编译结束后从新加载时,OnDisable将被调用,

OnEnable在脚本被载入后调用。

天下 发表于 2017-3-5 21:22

楼主是超人

无敌甩葱歌 发表于 2017-3-5 21:11

好帖就是要顶

guoer2113 发表于 2017-3-5 21:12

顶顶多好

草根 发表于 2017-3-5 21:19

很好哦

无敌甩葱歌 发表于 2017-3-5 20:55

LZ真是人才

肖鱼 发表于 2017-3-16 18:30

顶顶多好

Janmy 发表于 2017-3-16 18:36

真心顶

LeDows 发表于 2017-3-16 18:29

难得一见的好帖

d_kb 发表于 2017-3-16 18:20

说的非常好
页: [1] 2 3 4
查看完整版本: Unity3D如何实现反射教程二