Glowing textures (Source)
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.
发光纹理是一种不需要其他光源即可被点亮的纹理。它可以创建独立于所有光源的光照贴图,甚至可以自身发光。这并不意味着表面会呈现纯白色,而是该面将忽略其接收到的任何光照。这是一个关键特性,因为“发光”的黑色仍然是黑色,不会变亮。该面实现了所谓的完全亮(fullbright),纹理的像素颜色会与保存时的颜色完全一致。
在Source引擎中,有多种方式可以实现此效果。
对于模型或刷面上的发光纹理:
$selfillum
参数,在材质的VMT中指定 - 适用于大多数情况,但不兼容透明效果。- $detail 参数与
$detailblendmode
的值为5或6,在材质的VMT中指定 - 功能类似于$selfillum
,但更为基础且兼容透明效果。 - UnlitGeneric 着色器,在材质的VMT中指定 - 不发光,强制面忽略所有光照,使其成为完全亮。
对于仅限刷面上的发光纹理:
- 使用
_minlight
实体键值。 - RAD文件,主要用于刷面上的发光纹理(“纹理光”)。RAD文件是唯一可以生成地图光照的发光纹理形式。 文件逐行处理;每行仅包含纹理名称、光的RGB值及其亮度。在White中可以找到常见的通用纹理光。
%CompileNoLight
材质地图编译标志 - 禁止为面生成光照贴图,即使使用了光照贴图着色器,也使其成为完全亮。不修改VBSP的情况下无法与其他编译标志兼容。
对于仅限模型上的发光纹理:
- $emissiveblend 参数,在材质的VMT中指定 - 兼容透明效果,可通过流动纹理(flowtexture)进行动画处理,如水。
- 使用 info_lighting 来“欺骗”模型,使其“认为”被明亮照亮。
$selfillum
自发光为表面应用“伪光源”,无论表面从环境中接收到的真实光如何。这对于像灯泡灯丝或控制面板上的发光LED这样发出自身可见光的模型部件非常有用。自发光效果可以使用纹理进行遮罩。
$selfillum
无法与模型上的 $translucent
或 $alphatest
一起使用。请改用 UnlitGeneric
着色器或使用 $detail
的替代方案。$selfillummask
和 $basemapalphaphongmask
进行解决。
sv_pure
设置为 -1
;请参阅 $detail 方法 了解解决方案。LightmappedGeneric { $basetexture props/tvscreen005a $selfillum 1 }
默认情况下,$selfillum
使用基础纹理的Alpha通道作为遮罩。如果基础纹理的Alpha通道用于其他用途,可以指定一个独立的 $selfillummask
纹理。
LightmappedGeneric { $basetexture props/tvscreen005a $selfillum 1 $selfillummask <texture> }
当使用不透明遮罩时,$selfillum
实际上会像 UnlitGeneric
一样工作。表面将忽略环境光并以完全亮(fullbright)显示。
遮罩值低于1.0时,会为表面应用最低亮度效果,同时仍允许其接收环境光。这种阈值效果对于计算机屏幕等对象非常有用,因为它们在黑暗中应该可见,但在强烈阳光下会被压制。
附加参数
- 注意:功能类似于颜色贴图。
- 待完善: 此功能在其他分支中如何与$phong交互?
- 警告:不适用于LightmappedGeneric,必须改用
$basetexture
的Alpha通道。(仅限$selfillum 1
) - 警告:在VertexLitGeneric中,当$bumpmap存在时不起作用,除非在 异形丛生中并且$phong存在。
- 警告: 起源2007必须使用此参数!
- 注意:
$selfillum_envmapmask_alpha
替代了原始$selfillum
命令,因此二者不能同时使用。 - 注意:此遮罩被乘以8。因此,要实现与其他遮罩方法相同的结果,请记得将
$selfillumtint
除以8。 - 警告:仅适用于VertexLitGeneric - 注意
$envmapmask
在$bumpmap或$phong与VertexLitGeneric一起使用时不起作用。
- 注意:自 起源2007以来已弃用。
- 注意:请改用$emissiveblend。
- 警告:启用时会禁用
$normalmapalphaenvmapmask
。 - 警告:在$detail或$lightwarptexture上不起作用,除非使用$phong。
- 警告:需要$bumpmap。
$phongfresnelranges
的菲涅耳范围不同。
- 第一个值是最小亮度,第二个值是最大亮度,最后一个值是菲涅耳指数。
$detail
如果$selfillum
不可行,可以改用$detail纹理。在某些游戏(例如 反恐精英:起源或 求生之路2)中,它可以绕过sv_consistency
检查(在现代分支中,将sv_pure
设置为除-1
以外的任何值),从而允许发光纹理而不会因为$selfillum
导致玩家被踢出服务器。
实现$detail
发光所需的VMT代码行:
$detail "models/weapons/pose/briefcase/briefcase_pickedup_red"
$detailscale 1 // 将细节纹理缩放到与漫射纹理相同的大小。
$detailblendmode 5 // 6也可以使用。如果两者都不可用(例如在LightmappedGeneric上),可以使用1,尽管它仍然会受到光照影响。
$detailblendfactor 可用于进一步降低纹理的亮度。
细节纹理本身必须完全是黑色,发光的部分应着色。较暗的颜色将发光较少。无法通过这种方式制作黑色发光纹理。
$emissiveblend
$Emissiveblend 是当 $selfillum 和 $detail 无法使用时的另一个替代方案。
例如,在(《求生之路2》)中,使用 $phong 的近战武器不能使用 $selfillum,因为 $bumpmap 会导致 $selfillum 失效,而 $phong 又依赖 $bumpmap。此外,这些武器也无法使用 $detail 来实现发光,因为血迹覆盖已使用了 $detail。因此,唯一的选择是 $emissiveblend。
最初,$emissiveblend 是为发光和流动纹理设计的,具体而言,是为 (《半衰期2:第二章》)中瓦提冈特(Vortigaunts)为 Alyx 治疗时的蓝色闪光设计的。然而,它也可以作为基本的自发光替代方案。
静态
这是一个静态 $emissiveblend 纹理的示例,它的表现类似于 $selfillum。
$EmissiveBlendEnabled 1 // 启用 EmissiveBlend。类似于 $selfillum 1
$EmissiveBlendStrength 1 // 整个发光效果的强度。
$EmissiveBlendTexture vgui/white // 这是无用的,但必须存在。
$EmissiveBlendBaseTexture Glow_texture_color // 这是发光纹理.vtf
$EmissiveBlendFlowTexture vgui/white // EmissiveBlend 可“流动”或移动。但我们是静态的,所以使用白色纹理。
$EmissiveBlendTint " [ 1 1 1 ] " // RGB 发光强度。保持为 1 1 1。可以用来调整每种颜色的发光强度。例如,可以用 [.5 1 1] 来使红色发光强度减半。
$EmissiveBlendScrollVector " [ 0 0 ] " // 如果设置了合适的 EmissiveBlendFlowTexture,则使 EmissiveBlend 在任意方向流动。我们是静态的,所以保持为 0 0。
在 求生之路2中,如果希望材质同时支持带遮罩的 Envmaps、Phong、Detail 和 EmissiveBlend 发光,可以使用以下预制材质:
VertexLitGeneric
{
// 纹理
$baseTexture baseTexture_with_envmap_mask // alpha 通道是 envmap 遮罩
$bumpmap bumpmap_with_phong_mask // alpha 通道包含 phong 遮罩。
// 环境贴图
$basealphaenvmapmask 1
$envmap env_cubemap
// Phong
$phong 1
$phongboost 10
$phongexponent 1
$phongfresnelranges "[.1 .4 2]"
// 发光
$EmissiveBlendEnabled 1
$EmissiveBlendStrength 1
$EmissiveBlendTexture vgui/white
$EmissiveBlendBaseTexture Glow_texture_color // 将此更改为所需的静态发光纹理。
$EmissiveBlendFlowTexture vgui/white
$EmissiveBlendTint " [ 1 1 1 ] "
$EmissiveBlendScrollVector " [ 0 0 ] "
// 细节
$detail "models/infected/hunter/hunter_01_detail.vtf"
$detailscale "1.75"
$detailblendfactor 1
$detailblendmode 0
$detailAmount 0
}
流动
这是一个流动 $emissiveblend 纹理的示例,看起来像水在模型上流动。
$EmissiveBlendEnabled 1 // 启用 EmissiveBlend。类似于 $selfillum 1
$EmissiveBlendStrength 1 // 整个发光效果的强度。
$EmissiveBlendTexture Glow_texture_color // 这是发光纹理.vtf
$EmissiveBlendBaseTexture Glow_texture_mask // 这是发光纹理的遮罩,类似于 $selfillummask。 应该是 VTF i8 格式,而不是 DXT5!
$EmissiveBlendFlowTexture Glow_texture_mask_flow // EmissiveBlend 可“流动”或移动。这是用作流动贴图的纹理,就像水一样。
$EmissiveBlendTint " [ 1 1 1 ] " // RGB 发光强度。保持为 1 1 1。可以用来调整每种颜色的发光强度。例如,可以用 [.5 1 1] 来使红色发光强度减半。
$EmissiveBlendScrollVector " [ 0 0 ] " // 如果设置了合适的 EmissiveBlendFlowTexture,则使 EmissiveBlend 在任意方向流动。我们是静态的,所以保持为 0 0。
使用 envmap
实现纯色发光
如果由于某些原因无法使用 $selfillum
或 $detail
实现发光,你仍然可以通过材质实现纯色发光。由于反射不受光照影响并在黑暗中显得发光,可以使用立方体贴图 (cubemap) 的高光反射来实现。
与 $selfillum
不同的是,你只能通过加色的方式让像素发光,即无法让材质的一部分发光,只能在其上叠加一种颜色的发光。可以通过使用白色的 cubemap,并利用 $envmapmask 使 cubemap 的反射在某些像素处可见来实现。同时,还可以通过 $envmaptint 将 cubemap 的发光调制为任意颜色。
.rad
文件
示例:
example\exampletexture 128 192 96 400
与 $selfillum
或 UnlitGeneric
shader 不同的是,在 VRAD 编译过程中,会在世界刷子的表面前生成指定颜色和亮度的灯光。生成的灯光亮度也会受到光照贴图密度的影响。更高的密度会产生更大的效果。纹理本身不会变为完全亮度,但前方的灯光通常会让其看起来像是全亮的。
如果同一纹理被多处指定,最后的定义会覆盖之前的信息。例如,如果 lights.rad 和 <mapname>.rad
文件都指定了相同的纹理,但 <mapname>.rad
定义的亮度更高,那么编译后的地图中发出的光会采用更亮的 <mapname>.rad
版本。
更多关于这种光照系统的工作原理,请参见 此处。
UnlitGeneric 贴图
UnlitGeneric
shader 强制整个面板完全发亮。表面不会发光,光照对表面没有可见的影响。主要用于纹理应该看起来像光源,而无需实际生成光的情况。只需将材质的着色器指定为 UnlitGeneric
即可实现效果。由于 UnlitGeneric
是自己的着色器,它可以应用于模型和世界刷子。
UnlitGeneric { $basetexture example\exampletexture }
一个常见的用例是 skybox 贴图,天空总是明亮,纹理所覆盖的面板本身没有光照效果。
UnlitGeneric
,请在 .vmt
文件中包含 $model 1 命令,否则可能导致表面无法显示。_minlight
所有 lightmap 灯光贴图的 brush entities 以及 worldspawn 都支持 _minlight
KV (某些 FGD 条目中称作 "Minimum Light Level"),用于控制添加到包含的灯光贴图的最低环境光量。这并不是严格意义上的发光纹理,而是另一种使纹理 "看起来" 发光的方法(而不会实际发光)。设置高值(从 5 到 50 甚至更多,根据纹理的亮度)会导致刷上的纹理发光明亮。
_minlight
可能对立方体贴图采样产生不成比例的影响,导致场景编译得过于明亮。_minlight
支持,而无需对 BSP 中的静态实体块做出兼容性破坏性的更改。info_lighting
可以通过将模型的 lighting origin 键值设置为一个放置在独立光箱内的 info_lighting
的名称,使其发光 (尽管它们实际上不会发光)。如右图所示,模型右侧已链接到一个放置在小方块内的 info_lighting
,其中包含九个 light 实体,每个光实体的亮度设置为 5000。
这种方式的一个可能有用的特性是,它在实时动态更新。如果光箱内的灯光与开关或触发器链接,或者预设为脉冲、闪烁等,则模型上的灯光会立即反映这些变化。例如,这可能用于模拟晚间的来临,让建模的地形逐渐变暗。