添加水
< Zh
水是起源引擎中一个非常复杂的着色器:它是动态、反射、有雾、折射且有凹凸贴图的,还可以流动。这种复杂带来了关于如何放置它以及什么样的水应该用于什么场合的一些规则和限制。
「昂贵的」水
这种水看起来最好,但消耗的资源最多。这个着色器会反射它周围的世界,折射和雾化水下的世界(根据水体的线积分),以及在水表面播放一个凹凸贴图的动画。虽然结果是照片级地逼真,但成本有时候会因为复杂的场景而变得非常高。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
「廉价的」水
有一些情况需要一个更简单的解决方案(通常由于性能原因),可以使用「廉价的」水。这种水并不能反射它周围的世界,使得它不太真实,不过也「便宜」得多。如果「昂贵的」水运行在那些不拥有让渲染器正确工作所必需的功能的显卡上的话,水会回退到「廉价的」水。而且如果用户设置了游戏里的视频设置里的水的可视化质量的话,水也会回退到这种材质。
要求
为了使其有效地执行,有一套关于水的使用和地图中放置的规则。
- 如果水是「昂贵的」,那么水在一个PVS 里只能有一种水位高度。
- 「昂贵的」和「廉价的」水不可以同时使用相同的PVS 。
- 水的表面永远都不应该在Z轴上倾斜;它应始终和地图上的水平线平行。
- 水是通过在一个固体上表面应用水的材质来创建的,而其他的面则是应用
tools\toolsnodraw
材质。 water_lod_control
实体控制「昂贵的」水转换成「廉价的」水的距离。- 要让低于DX9的硬件能正确渲染水面,必须存在一个
env_cubemap
实体。
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
func_water_analog
和func_water
创建
要给你的地图添加一个水体,步骤如下:
- 用固体工具(Block Tool)创建一个跟水体一样大小的固体。
- 点击贴图工具栏上的浏览(Browse)按钮来打开贴图浏览器(Texture Browser)。
- 双击贴图浏览器里的
tools\toolsnodraw
材质。 - 选中你的水固体,点击应用当前贴图(Apply Current Texture)按钮来指派
tool textures|tools\toolsnodraw
材质给水固体。 - 选择贴图应用工具(Texture Application tool),打开面编辑(Face Edit)模式。
- 在3D视图里左击水固体最顶层的面来选中它。
- 点击浏览(Browse)来再次弹出贴图浏览器(Texture Browser)。
- 在过滤器(filter)部分键入
water
。这将会显示所有名字中包含关键词water
的所有材质。 - 双击一个水材质来应用它。这里有一个可以尝试的水材质:
nature/water_canals_water2
。 - 点击面编辑(Face Edit)面板上的应用(Apply)按钮
- 固体现在应该正确应用了水材质了。编译并运行你的地图(启用VVIS和VRAD)来测试它。
为了让水面正确渲染,你的地图需要有一个天空盒,水体本身应该是矩形。为了隐藏不想要的区域,这个固体可以跟其他固体相交。 如果水没有被正确渲染(你看不到它),这意味着你地图上哪里有着泄露。
游戏的具体注意事项
L4D2地图还需要一个
env_fog_controller
。Alien Swarm(异型丛生)里所有的水固体都必须被附着在一个名为「structure_seal」的
func_brush
。在Portal(传送门)里,要创建有毒的水,你必须使用
nature/hazard_liquid
材质。
反射球与水
反射球对于水的表面是很重要的。在低于DX9级别的显卡上,要渲染实时反射水着色器是不可能的。对于这些显卡,一个env_cubemap
实体将提供预先计算的的水环境贴图。
给水面添加一个env_cubemap
:
- 使用实体工具(Entity Tool)添加一个
env_cubemap
实体。 - 在水的顶层的面上方,接近中心的地方放置
env_cubemap
。 - 在3D视图下双击
env_cubemap
来弹出物体属性对话框(Object Properties dialog)。 - 在物体属性(Object Properties)里点击固体面(Brush faces)。
- 点击拾取...(Pick...)按钮。鼠标光标将变为滴管图标。
- 点击顶层水面来用滴管选择。水面会以红色高亮显示,来表示它已经和env_cubemap 实体关联。
- 关闭物体属性(Object properties)对话框。
- 编译并运行你的地图。载入地图后,打开开发者控制台,键入
buildcubemaps
。引擎会为每一个env_cubemap
实体计算一个环境贴图,然后保存到BSP 文件里。