Notifications
Article
[HDRP]如何动态修改Volume效果
Published 12 days ago
209
2
教你通过代码修改HDRP的Volume,你一定用得上,此方法URP也适用哦~~~
大家好,Tobi来这记一下我最近学HDRP的一些心得。最近在学习HDRP的使用,其中最主要的当然就是Volume框架了。但是现在大部分博客都在讲用出来的效果,我这里就不一个个演示了,有兴趣的可以自己去一个个慢慢试着玩。
最近在使用HDRP的过程中,我想通过代码来动态修改HDRP的Volume的值,于是上网搜了一下,都是以前PostProcessVolume的一些代码,这个组件现在基本用不上了。然后又看了看官方文档,也没有相关示例,甚至没看到Volume的命名空间。
很多美术都是通过Volume在Local模式下的BlendDistance来控制动态效果,其实这样有很多弊端。
于是我就自己试了试,发现Volume的命名空间是UnityEngine.Rendering。
于是我新建了一个脚本叫PostProcessController。并且挂在了新建的HDRP工程的Post Process Volume下面。然后我随手Override了几个效果。如图:
为了看看Volume里面有什么,我在PostProcessController的Start里,通过profile获取了所有组件,并打印了出来。
结果如下:
这样看来,可以通过一个VolumeComponent的List获取全部组件。
这个时候再用List的操作来获取具体组件,然后我们可以通过VolumeComponent的parameters来获取组件上的参数。
这个时候我再次打印parameters,看看上面的内容,我打印了Vignette:
结果如下:
这时候你会发现上面的Vignette的参数只有7个,怎么这里有9个,其实另外两个是你切换模式后,新的模式下的两个参数Mask和Opacity。
由于Mode和Color在两种模式下是一样的,所以共享参数一和二的位置。
八九的位置就是Mask和Opacity。
这里再说一下Vignette。Vignette可以让你遮罩你的相机画面,让你相机被任何颜色或形状覆盖掉,我觉得这个用途很广。很多Unity的网上示例让你在相机前放一个黑色的Plane来控制其Alpha去实现屏幕变黑的效果,但是那个问题有时候很多,而这个比较正规一点,我这里就用Masked的模式来动态的切换相机的画面是否变黑,我在Mask上放上了UIMask。
在控制参数的时候一定要确保参数是被勾选的,不然代码不会起作用,当然你也可以在代码里面通过VolumeParameterd的overrideState判断一下该参数是否选中。
设置参数的时候通过VolumeParameter的SetValue来设置,传一个VolumeParameter作为参数:
然后我就对VolumeParameter的赋值产生了兴趣。因为它的构造是Protected的。
为了给Opacity传递float值,我通过gettype查看其类型:
结果如下:
然后我又看了看ClampedFloatParameter,发现为了安全性,它的构造特别长,但是我想看看有没有短的,然后看到了它的父类FloatParameter。
FloatParameter的构造就可以直接传递Float了:
为了演示效果,我在Update里面加入了不停更新数值的代码:

好了,效果是这样的:
其他的组件像DepthOfField、Exposure什么的都能这样通过代码控制。
但是这里友好的提示一下VR程序的用户,类似Motion Blur(动态模糊)、Depth of Field(景深效果)等等一些HDRP效果,这些专为模拟摄像机画面的效果,其实VR开发里面用的不多,可以说基本用不上,对于VR程序员,还是专注的看看对自己有用的组件比较好。
好了,动态修改HDRP的Volume就介绍到这里,希望Tobi这篇文章能帮到你,谢谢~~~
Tobi
Programmer
5
Comments
Tobi
11 days ago
CGBull这个Package的文档里面CoreRPLibrary里面就是Volume的内容了
?我们说的是一个事情吗?
0
CGBull
11 days ago
Talk Artist
这个Package的文档里面CoreRPLibrary里面就是Volume的内容了
0