Zh/Adding Water
< Zh
Jump to navigation
Jump to search
水是Source里一个非常复杂的着色器:它是动态的,反光,雾气,折射和凹凸贴图。这种复杂的规则和限制在于如何放置它以及什么样的水应该用于什么样的场合。
"昂贵的"水
这种水看起来很好,但也是耗成本最多的。这个着色器会反射它周围的世界,折射和雾视海底世界(根据通过水体积的线积分),以及在水表面播放一个凹凸贴图的动画。虽然结果是照片级地逼真,但成本有时候会因为复杂的场景而变得非常高。 Template:Note:zh-tw
"廉价的"水
在一些情况下,一个更简单的解决方案被称为"廉价的" 水(通常由于性能原因),"廉价的"水也许还是用得到的。这个版本的水并不能反射它周围的世界,使得它不太真实,不过也"便宜"得多。如果"昂贵的"水运行在那些不拥有让渲染器正确工作所必需的功能的显卡上的话,水会回退到"廉价的"水。而且如果用户设置了游戏里的视频设置里的水的可视化质量的话,水也会回退到这种材质。
要求
为了使其有效地执行,水也有一个关于其使用规则和地图中使用位置的汇总。
- 如果水是"昂贵的",那么水在一个PVS里可能只有一种水位高度。
- "昂贵的"和"廉价的"水可能无法同时使用相同的PVS。
- 水的表面永远都不应该在Z轴出现斜面;它应始终和地图上的水平线平行。
- 水是通过在一个固体的最顶层的面应用水的材质来创建的,而其他的面则是应用
tools\toolsnodraw
材质。 - water_lod_control实体控制"昂贵的"水转换成"廉价的"水的距离。
- 一个env_cubemap实体必须存在于水的表面才能让DX9硬件着色器能正确渲染。
结构
要添加一个体积水到你的地图,跟随这些步骤:
- 用固体工具(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
材质。
Cubemaps和水
Cubemaps对于水的表面是很重要的。在低于DX9级别的显卡上,要渲染实时反射水着色器是不可能的。对于这些显卡,一个env_cubemap实体将提供预先计算的,原本在DX9显卡下呈现的水环境贴图。
添加一个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文件里。