Direct3D 9) 的纹理寻址 (模式

Direct3D 应用程序可以将纹理坐标分配至任何基元的任何顶点。 有关详细信息,请参阅 Direct3D 9 (纹理坐标) 。 通常,你分配至某个顶点的 u 纹理以及 v 纹理坐标的范围介于 0.0-1.0(包含这两个值)。 但如果在此范围之外分配纹理坐标,则可以创造某些特殊的纹理效果。

通过设置纹理寻址模式,可以控制 Direct3D 如何使用在 [0.0, 1.0] 范围以外的纹理坐标。 例如,你可以通过应用程序设置纹理寻址模式,以使得纹理跨基元平铺。

借助 Direct3D,应用程序可以执行纹理环绕。 请务必注意,将纹理寻址模式设置为D3DTADDRESS_WRAP与执行纹理包装不同。 将纹理寻址模式设置为D3DTADDRESS_WRAP会导致将源纹理应用于当前基元的多个副本,并启用纹理包装更改系统光栅化纹理多边形的方式。 有关详细信息,请参阅 Texture Wrapping (Direct3D 9)

有效地启用纹理环绕可使超出 [0.0, 1.0] 范围的纹理坐标无效,且在此情况下,光栅化此类疏忽的纹理坐标的行为并未定义。 当纹理环绕处于启用状态时,不能使用纹理寻址模式。 请注意,当纹理环绕处于启用状态时,你的应用程序不会指定低于 0.0 或高于 1.0 的纹理坐标。

设置寻址模式

可以通过调用 IDirect3DDevice9::SetSamplerState 方法为各个纹理阶段设置纹理寻址模式。 在 Sampler 参数中指定所需的纹理阶段标识符。 将 Type 参数设置为D3DSAMP_ADDRESSU、D3DSAMP_ADDRESSV或D3DSAMP_ADDRESSW值,以单独更新 u-、v 或 w 寻址模式。 Value 参数确定正在设置的模式。 这可以是 D3DTEXTUREADDRESS 枚举类型的任何成员。 若要检索纹理阶段的当前纹理地址模式,请使用D3DSAMP_ADDRESSU、D3DSAMP_ADDRESSV或 D3DSAMPLERSTATE 枚举D3DSAMP_ADDRESSW成员调用 IDirect3DDevice9::GetSamplerState,以标识所需信息的地址模式。

设备限制

尽管系统一般情况下支持超出 0.0-1.0(包括这两者)范围的纹理坐标,但硬件限制通常会影响纹理坐标可超出的范围。 检索设备功能时,呈现设备在 D3DCAPS9 结构的 MaxTextureRepeat 成员中传达此限制。 此成员中的值描述了设备允许的纹理坐标的完整范围。 例如,如果限值为 128,则输入的纹理坐标必须控制在 -128.0 至 +128.0 的范围内。 使超出该范围的纹理坐标通过顶点是无效的。 相同的限制适用于因纹理坐标自动生成以及纹理坐标变换而生成的纹理坐标。

MaxTextureRepeat 的解释也受D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE功能位的影响。 设置此位后, MaxTextureRepeat 成员中的值将精确使用,如前所述。 但是,如果未设置D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE,纹理重复限制取决于纹理坐标编制索引的纹理的大小。 在这种情况下, MaxTextureRepeat 必须按当前纹理大小缩放,其详细信息级别最大,以计算有效的纹理坐标范围。 例如,鉴于纹理尺寸为 32 且 MaxTextureRepeat 为 512,实际有效的纹理坐标范围为 512/32 = 16,因此此设备的纹理坐标必须介于 -16.0 到 +16.0 的范围内。

有关纹理寻址模式的其他信息包含在以下主题中。

基本文本设计概念