这篇条目有关 Source引擎。如需详情,点击这里。

水体

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Français (fr)中文 (zh)Translate (Translate)
Info content.png
This page needs to be translated.
This page either contains information that is only partially or incorrectly translated, or there isn't a translation yet.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article tries to comply with the alternate languages guide.

Split-arrows.png 分裂

It has been suggested that this article or section be split into multiple articles: 水体(着色器)(en)液体材质(en)
后者应记录与着色器无关的参数,例如%CompileWater和%CompileSlime材质的相关参数。。 (Discuss)

水体是一个像素着色器(en),可在所有的 起源 起源 游戏中使用。

水体在Episode Two中实时反射实体。
《求生之路2》引入了流动水体光照贴图雾效

它能够创建真实地反射和折射场景的水体,并能在整个地图中流动。

Tip.png提示:水体(en)并不需要使用Water着色器!如果需要较不真实的效果,或者水体形状不规则,可以使用其他着色器,例如光照贴图通用材质(en)折射材质(en)。材质的创建方法是相同的。
待完善: 将与着色器无关的水体参数移动到一个单独的部分。

特殊行为

昂贵和廉价
水体材质分为两类:昂贵廉价。昂贵水体在实时反射和折射场景,而廉价水体使用$envmap并且不会折射。用户可以通过视频选项禁用昂贵水体渲染,因此在整个地图中始终放置env_cubemap实体。
水面上方和水面下方
水体实际上需要两个材质:一个在水面上,一个在水面下。这些材质是独立的,但为了获得正确的效果,必须在大部分区域内关联。
流动贴图
水体可以在任意方向流动。然而,手动创建流动贴图非常复杂,而Valve内部使用的工具尚未公开。

着色器参数

贴图

$basetexture(en) <texture(en)> (存在于自 异形丛生 以来)
通常称为“污泥层”,作为$AboveWater材质的表面层。
Warning.png警告:只有在没有$FlowMap时,$BaseTexture才会被光照贴图!
Warning.png警告:在没有$FlowMap的情况下,这个参数不能与投影贴图或$LightMapWaterFog一起使用!
Note.png注意:在游戏之前的异形丛生版本中,表面是由雾色、动画凸凹图、反射和折射组合而成。
Tip.png提示:如果在早期游戏中需要一个BaseTexture,并且不需要实时反射,可以使用Refract着色器代替。
这个材质是否用于水面的上方或下方。
Note.png注意:在VMT中未设置该参数将自动强制它为1。如果未定义,会出现一个警告,提示 需要为材质x设置$abovewater
必需的参数。这是当在水下时使用的材质(不是贴图)。底材质必须禁用$reflecttexture$abovewater$envmap,否则可以自由发挥。
Tip.png提示:在底材质中添加%notooltexture可以将其隐藏在材质浏览器中Hammer++
Note.png注意:如果水面材质没有反射、折射或$underwateroverlay,可以省略$abovewater,可以使用[$nocull],并将$bottommaterial设置为与$abovewater材质相同的材质。
$underwateroverlay(en) <material(en)> (存在于自 起源2007 以来)
当相机处于水下时,应用一个折射屏幕叠加效果。通常与effects\water_warp01一起使用。需要$abovewater为0。
Note.png注意:这是水体着色器中的技术性参数,因此可以被滥用用于其他意外的用途!即便在水下材质中告诉它不渲染时,叠加效果依然可能被应用($no_draw)。
$bumpmap(en) <texture(en)> (DX8)
DirectX 8渲染用的Du/dv map,DirectX 9及以上用的bump map。这些应当是动态动画的,除非水体非常平静或使用了流动贴图,从而使动画凸凹图变得多余。
Note.png注意:$normalmap参数是水体着色器独有的,使用法线贴图。当使用水体着色器时,du/dv map用来表示$bumpmap$dudvmap命令已经过时。
Tip.png提示:在2006年之前的引擎版本中使用$bumptransformTextureScroll代理来移动法线贴图。
动画du/dv贴图和凸凹贴图的起始帧,分别。稍微令人困惑的是,$bumpframe会影响$normalmap,该$normalmap应指向一个bump map
变换凸凹图贴图。
The default position is center .5 .5 scale 1 1 rotate 0 translate 0 0.
  1. center defines the point of rotation. Only useful if rotate is being used.
  2. scale fits the texture into the material the given number of times. 2 1 is a 50% scale in the horizontal X axis while the vertical Y axis is still at original scale.
  3. rotate rotates the texture counter-clockwise in degrees. Accepts any number, including negatives.
  4. translate shifts the texture by the given numbers. .5 will shift it half-way. 1 will shift it once completely over, which is the same as not moving it at all.
Note.png注意:All values must be included!
Icon-Bug.png错误:Scaling the texture may cause odd issues where the Texture Lock tool in Hammer will not actually lock the texture in place.  [todo tested in ?]
Icon-Bug.png错误:Rotating textures applied on brushes will rotate around the map origin (confirm: Orangebox engine only?). A fix for this is to change the center position in the VMT to the brush's origin.  [todo tested in ?]
未使用的参数。- 可能是$RefractAmount和$ReflectAmount的前身。
起源2013异形丛生的着色器代码中,$Reflect/$RefractAmount会被整合到一个单一的float4中,以节省指令,例如:
"[$ReflectAmount, $ReflectAmount, $RefractAmount, $RefractAmount]"。这几乎就是$Scale,但多了两个分量。
常量寄存器被称为'g_ReflectRefractScale'。着色器目前唯一对它做的就是设置一个默认值"[1 1]"。
$flashlighttint(en) <浮点型(en)> (存在于自 求生之路2 以来)
为水体上投影纹理着色。手电筒主要影响水体雾中的亮度。异形丛生的着色器代码解释:
“水面上的手电筒基本上是散射手电筒 * 水雾颜色 * g_flFlashlightTint。 g_flFlashlightTint是可以调整的,在水雾颜色非常深的情况下,手电筒不会显示出来等。”
$waterdepth(en) <浮点型(en)> (存在于自 反恐精英:全球攻势 以来)
待完善: 这具体做什么?似乎与$waterblendfactor有关。出现在liquids/nuke_water.vmt中。出现在2006/2007年的代码中,它在那里是否有作用?
$depth_feather(en) <整数(en)> (存在于自 反恐精英:全球攻势 以来)
待完善: 这具体做什么?出现在liquids/nuke_water.vmt中。

为水体启用体积雾。
Note.png注意:该参数并不在着色器本身,它的逻辑处理在其他地方。
水体体积雾的颜色。一般来说,这个值应与底材质中使用的颜色相匹配。
Icon-Important.png重要:如果在VMT中未定义此参数,着色器会强制其值为 "[1 0 0]",并输出一条错误消息,提示材质x需要定义$fogcolor。
Warning.png警告:

便宜水体将此参数视为线性值,其中0.0为0%,1.0为100%。
高端水体将此参数视为Gamma值,
由于此原因,每个分量(红、绿、蓝)不能超过1.0或低于0.0(在高端水体中)。

计算着色器最终提供的线性值,应用公式x^(1/2.2)
Tip.png提示:尽管高端水体无法做到,便宜水体可以超过1.0,产生一种更为“霓虹”的效果。
从眼睛开始,到水雾开始的距离,单位/英寸。
Warning.png警告:必须设置为0,以使边缘渐隐效果正常工作。
从眼睛开始,到水雾结束的距离。
$lightmapwaterfog(en) <布尔值(en)> (存在于自 求生之路2 以来)
允许雾接收lightmap,这样静态对象可以投射阴影到水体上。在地图编译时必须启用此功能。
Note.png注意:提升光照贴图仅在定义了$BaseTexture时启用,若未定义,将使用普通光照贴图。
Warning.png警告:此功能不适用于便宜水体。

反射

用于反射的纹理。对于实时反射,使用_rt_WaterReflection
反射的扭曲程度。更高的值会产生更明显的反射效果。
高端和便宜反射的颜色调节。
Warning.png警告:此参数在高端水体中是Gamma空间,意味着它会在传递给着色器之前转换为线性值。
计算着色器最终提供的线性值,应用公式x^(1/2.2)
参见$envmap。为便宜水体提供反射。
Note.png注意:请勿在水下材质上使用此参数Template:为什么
动画立方体贴图的起始帧。
$forceenvmap(en) <布尔值(en)> (存在于自 传送门2 以来)
强制水体使用$envmap进行反射。
强制水体渲染为cheap,无论地图的water_lod_control实体设置还是用户设置。此选项将禁用实时反射,而改为使用$envmap。折射假设为水雾颜色不透明。
强制水体渲染为expensive,无论地图的water_lod_control实体设置还是用户设置。
从眼睛开始,到水体应该开始过渡到更便宜的水体贴图的距离(单位:英寸)。
从眼睛开始,到水体应该完成过渡到更便宜的水体贴图的距离(单位:英寸)。
水体是否反射实体。默认情况下,不反射任何实体。
$reflectonlymarkedentities(en) <布尔值(en)> (存在于自 传送门2 以来)
水体仅反射启用了“在快速反射中渲染”的实体和静态物件。
$reflectskyboxonly(en) <布尔值(en)> (存在于自 求生之路2 以来)
水体仅反射skybox
Icon-Bug.png错误:使用此设置,求生之路2中当水体没有“reflectskyboxonly”时,env_sun精灵会出现在地板上。  [todo tested in ?]
$reflect2dskybox(en) <布尔值(en)> (存在于自 传送门2 以来)
水体反射skybox材质除此之外的其他反射。
$reflect3dskybox(en) <布尔值(en)> (存在于 反恐精英:全球攻势 之中)
水体反射3D skybox除此之外的其他反射。在Danger Zone更新中添加,用于'dz_blacksite
Note.png注意:需要在地图中放置一个sky_camera实体,否则可能会导致崩溃。
待完善: 这是什么功能?
$nofresnel(en) <布尔值(en)> (存在于自 起源2006 以来)
禁用水体反射的Fresnel。
Icon-Bug.png错误:在任何引擎分支中都不起作用。  [todo tested in ?]
$forcefresnel(en) <浮点型(en)> (存在于自 异形丛生 以来)
强制此程度的Fresnel。较高的值通常会使水体看起来更明亮。
Icon-Bug.png错误:InsurgencyDay of Infamy中无法正确工作。  [todo tested in ?]
待完善: 这是啥?
待完善: 这是啥?

折射

$refract(en) <布尔值(en)> (存在于自 求生之路2 以来)
材质是否应进行折射。
用于折射的纹理。对于实时折射,使用_rt_WaterRefraction
Tip.png提示:$reflecttexture没有定义的情况下,指定$refracttexture可获取$envmap反射的实时折射效果。
折射的扭曲程度。更高的值会产生更多的折射扭曲。
折射的颜色。
Warning.png警告:建议将其设置为白色或接近白色,以便在DX9上能够正确处理边缘过渡。
Warning.png警告:此参数在Gamma空间,意味着它会在传递给着色器之前转换为线性值。
计算着色器最终提供的线性值,应用公式x^(1/2.2)
$blurrefract(en) <布尔值(en)> (DX9 SM2) (存在于自 起源2007 以来)
在水下时模糊折射。
Warning.png警告:仅水下材质;在任何材质中都可能导致错误行为,材质中包含$abovewater设为1时。
$pseudotranslucent(en) <布尔值(en)> (存在于自 传送门2 以来)
使水体半透明。这是折射水的廉价替代品;当启用折射时请勿使用此参数。
$waterblendfactor(en) <normal(en)> (存在于自 传送门2 以来)
当启用$pseudotranslucent时,水体的透明度。当值为0时,水体完全透明,而值为1时,水体完全不透明。

流水

$scroll1 "[<normal X> <normal Y>]" (存在于自 起源2006 以来)
$scroll2 "[<normal X> <normal Y>]" (存在于自 起源2006 以来)
如果定义了$scroll1并且X值不为零,将绘制两个额外的法线图层,这些图层会合并在一起。第一个层级是原始法线图层的7倍大并旋转45°;第二个是原始法线图层的2倍大并旋转90°。参数指定了额外图层的移动速度和方向。(Valve的材质通常包含第三个数字,但它似乎没有显著效果,最可能已经过时。)

流动贴图

一个流动贴图。
引擎中流动贴图显示。
引擎中效果示例。
$flowmap(en) <texture(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
定义流动速度的纹理,通过扭曲和滚动$normalmap来实现。Valve通过Houdini生成他们的流动贴图。
视频展示。有关技术细节,请参见Alex Vlachos的SIGGRAPH 2010论文Valve的GDC 2011论文
Warning.png警告:将此参数与$BaseTexture一起使用会使$BaseTexture在光照下无效。
$flow_normaluvscale(en) <浮点型(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
法线贴图重复前覆盖的世界单位数量。通常在100左右。
$flow_worlduvscale(en) <浮点型(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
流动贴图在材质中适合的次数。面贴图缩放会影响此值。
$flow_uvscrolldistance(en) <浮点型(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
法线贴图应扭曲的距离。更高的值会导致更多的扭曲。
$flow_timeintervalinseconds(en) <浮点型(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
法线贴图穿过$flow_uvscrolldistance所需的时间。
$flow_timescale(en) <浮点型(en)> (存在于自 求生之路2 以来)
修改流动速度而不影响扭曲程度。
$flow_bumpstrength(en) <normal(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
水面粗糙度。
$flow_noise_texture(en) <texture(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
用于打破法线贴图重复的处理贴图。
$flow_noise_scale(en) <浮点型(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
噪声贴图在法线贴图中适合的次数。通常为0.01。
$flow_debug(en) <布尔值(en)> (存在于自 求生之路2 以来) (也存在于 Xengine 之中)
用流动贴图替换水面。
Icon-Bug.png错误:虽然流动贴图会在Hammer中显示,但它可能显示在错误位置!不要依赖Hammer的视图来进行对齐。  [todo tested in ?]
待完善: 添加黑山 黑山参数。

基础纹理流动

$basetexture(en) <texture(en)> (存在于自 异形丛生 以来) (也存在于 Xengine 之中)
“污泥层”,用于《Portal 2》中测试舱中的污泥和碎片。$basetexture的alpha通道作为反射的遮罩;值越暗,反射越明显;值越亮,反射越弱。
Note.png注意:从《Portal 2》起,$basetexture的透明度由流动贴图的alpha通道控制。
$color_flow_uvscale(en) <浮点型(en)> (存在于自 异形丛生 以来) (也存在于 Xengine 之中)
基础纹理在重复之前覆盖的世界单位数量。通常在100左右。
$color_flow_timescale(en) <浮点型(en)> (存在于自 异形丛生 以来)
修改流动速度而不影响扭曲程度。
$color_flow_timeintervalinseconds(en) <浮点型(en)> (存在于自 异形丛生 以来) (也存在于 Xengine 之中)
基础纹理穿过$color_flow_uvscrolldistance所需的时间。
$color_flow_uvscrolldistance(en) <浮点型(en)> (存在于自 异形丛生 以来) (也存在于 Xengine 之中)
基础纹理在流动贴图中扭曲的距离。更高的值会导致更多的扭曲。
$color_flow_lerpexp(en) <浮点型(en)> (存在于自 异形丛生 以来) (也存在于 Xengine 之中)
重复之间过渡的锐度,应该为1。
待完善: 更好的解释
$color_flow_displacebynormalstrength(en) <浮点型(en)> (存在于自 传送门2 以来) (也存在于 Xengine 之中)
法线贴图对基础纹理的影响程度。使用极低的值,通常为0.01或更小。

流动贴图的创作

流动贴图的水流方向取决于流动贴图的红绿通道。

总体来说,尝试手动创建流动贴图是一个噩梦。手动绘制流动贴图、将其调整到世界中、并绘制泡沫,非常困难。

但是,如果你想尝试,可以从流动贴图的红绿通道读取流动方向。50%灰度意味着没有移动。

使用流动贴图的水纹理的任何面贴图的纹理缩放似乎与流动贴图直接相关。使用较少的水面或平面时,创建自定义流动贴图的过程会更容易(当使用“视为一”功能进行缩放匹配时,选择所有水面也是一种可能的选择)。

红色通道
X轴
绿色通道
Y轴
透明度通道
控制从《Portal 2》起$basetexture的混合。
现在有工具可以帮助绘制流动贴图。
Flow field editor from algoholic.eu : http://algoholic.eu/another-flow-field-editor-update/ [dead link]
Flowmap generator (paid): http://www.superpositiongames.com/products/flowmap-generator
使用Houdini(UDK)创建流动贴图 : https://www.dropbox.com/s/ii2x077vj64lyhl/Water%20Flow%20For%20UDK.pdf [dead link]

其他

这是使材质正确编译所必需的。
可以替代%CompileWater以获得不同的粒子效果。
Icon-Important.png重要:平面反射无法与此一起使用。
告知物理系统该表面是水。参见 $surfaceprop
定义工具将在材质浏览器中显示的纹理。任何纹理都可以使用,但通常使用 $normalmap
WaterLOD proxy
这连接到水的内部参数的 water_lod_control 实体。必须在材质中声明它,以使LOD机制正常工作。

另见