Zh/Glowing textures (Source)

发光纹理是一种不需要其他光源即可被点亮的纹理。它可以创建独立于所有光源的光照贴图，甚至可以自身发光。这并不意味着表面会呈现纯白色，而是该面将忽略其接收到的任何光照。这是一个关键特性，因为“发光”的黑色仍然是黑色，不会变亮。该面实现了所谓的完全亮（fullbright），纹理的像素颜色会与保存时的颜色完全一致。
在Source引擎中，有多种方式可以实现此效果。
对于模型或刷面上的发光纹理：
* $selfillum 参数，在材质的VMT中指定 - 适用于大多数情况，但不兼容透明效果。
* 参数与 $detailblendmode 的值为5或6，在材质的VMT中指定 - 功能类似于 $selfillum，但更为基础且兼容透明效果。
* 着色器，在材质的VMT中指定 - 不发光，强制面忽略所有光照，使其成为完全亮。
对于仅限刷面上的发光纹理：
* 使用 实体键值。
* RAD文件，主要用于刷面上的发光纹理（“纹理光”）。RAD文件是唯一可以生成地图光照的发光纹理形式。 文件逐行处理；每行仅包含纹理名称、光的RGB值及其亮度。在White中可以找到常见的通用纹理光。
* 材质地图编译标志 - 禁止为面生成光照贴图，即使使用了光照贴图着色器，也使其成为完全亮。不修改VBSP的情况下无法与其他编译标志兼容。
对于仅限模型上的发光纹理：
* 参数，在材质的VMT中指定 - 兼容透明效果，可通过流动纹理（flowtexture）进行动画处理，如水。
* 使用 来“欺骗”模型，使其“认为”被明亮照亮。
==$selfillum==
自发光为表面应用“伪光源”，无论表面从环境中接收到的真实光如何。这对于像灯泡灯丝或控制面板上的发光LED这样发出自身可见光的模型部件非常有用。自发光效果可以使用纹理进行遮罩。
 LightmappedGeneric
 {
 $basetexture props/tvscreen005a
 $selfillum 1
 }
默认情况下，$selfillum 使用基础纹理的Alpha通道作为遮罩。如果基础纹理的Alpha通道用于其他用途，可以指定一个独立的 $selfillummask 纹理。
 LightmappedGeneric
 { 
 $basetexture props/tvscreen005a
 $selfillum 1
 $selfillummask <texture>
 }
当使用不透明遮罩时，$selfillum 实际上会像 UnlitGeneric 一样工作。表面将忽略环境光并以完全亮（fullbright）显示。
遮罩值低于1.0时，会为表面应用最低亮度效果，同时仍允许其接收环境光。这种阈值效果对于计算机屏幕等对象非常有用，因为它们在黑暗中应该可见，但在强烈阳光下会被压制。
===附加参数===
==$detail==
如果$selfillum不可行，可以改用纹理。在某些游戏（例如或）中，它可以绕过检查（在现代分支中，将设置为除以外的任何值），从而允许发光纹理而不会因为$selfillum导致玩家被踢出服务器。
实现$detail发光所需的VMT代码行：
$detail "models/weapons/pose/briefcase/briefcase_pickedup_red"
 
$detailscale 1 // 将细节纹理缩放到与漫射纹理相同的大小。
 
$detailblendmode 5 // 6也可以使用。如果两者都不可用（例如在LightmappedGeneric上），可以使用1，尽管它仍然会受到光照影响。
 可用于进一步降低纹理的亮度。
细节纹理本身必须完全是黑色，发光的部分应着色。较暗的颜色将发光较少。无法通过这种方式制作黑色发光纹理。
==$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。
在中，如果希望材质同时支持带遮罩的 Envmaps、Phong、Detail 和 EmissiveBlend 发光，可以使用以下预制材质：
=== 流动 ===
这是一个流动 $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，并利用 使 cubemap 的反射在某些像素处可见来实现。同时，还可以通过 将 cubemap 的发光调制为任意颜色。
==.rad 文件==
 示例：
example\exampletexture 128 192 96 400
与 $selfillum 或 UnlitGeneric shader 不同的是，在 VRAD 编译过程中，会在世界刷子的表面前生成指定颜色和亮度的灯光。生成的灯光亮度也会受到光照贴图密度的影响。更高的密度会产生更大的效果。纹理本身不会变为完全亮度，但前方的灯光通常会让其看起来像是全亮的。
如果同一纹理被多处指定，最后的定义会覆盖之前的信息。例如，如果 和 <mapname>.rad 文件都指定了相同的纹理，但 <mapname>.rad 定义的亮度更高，那么编译后的地图中发出的光会采用更亮的 <mapname>.rad 版本。
更多关于这种光照系统的工作原理，请参见 此处。
== 贴图==
UnlitGeneric shader 强制整个面板完全发亮。表面不会发光，光照对表面没有可见的影响。主要用于纹理应该看起来像光源，而无需实际生成光的情况。只需将材质的着色器指定为 UnlitGeneric 即可实现效果。由于 UnlitGeneric 是自己的着色器，它可以应用于模型和世界刷子。
UnlitGeneric
{
	$basetexture example\exampletexture
}
一个常见的用例是 skybox 贴图，天空总是明亮，纹理所覆盖的面板本身没有光照效果。
== _minlight ==
所有 lightmap 灯光贴图的 brush entities 以及 worldspawn 都支持 KV （某些 FGD 条目中称作 "Minimum Light Level"），用于控制添加到包含的灯光贴图的最低环境光量。这并不是严格意义上的发光纹理，而是另一种使纹理 "看起来" 发光的方法（而不会实际发光）。设置高值（从 5 到 50 甚至更多，根据纹理的亮度）会导致刷上的纹理发光明亮。
 
== info_lighting ==
可以通过将模型的 lighting origin 键值设置为一个放置在独立光箱内的 info_lighting 的名称，使其发光 (尽管它们实际上不会发光)。如右图所示，模型右侧已链接到一个放置在小方块内的 info_lighting，其中包含九个 实体，每个光实体的亮度设置为 5000。
这种方式的一个可能有用的特性是，它在实时动态更新。如果光箱内的灯光与开关或触发器链接，或者预设为脉冲、闪烁等，则模型上的灯光会立即反映这些变化。例如，这可能用于模拟晚间的来临，让建模的地形逐渐变暗。