位移映射 (Direct3D 9)

位移贴图类似于纹理贴图,但由顶点引擎访问。

框图

另一个采样器阶段存在于顶点管道的早期部分,如下图所示,它可以对位移映射进行采样以提供顶点位移数据。

顶点管道中采样器阶段的示意图

位移映射采样器状态可由 SetSamplerState 使用阶段编号 256 设置,这是一个新的阶段编号。 位移贴图纹理由 SetTexture 设置。

地图可以预先采样或不采样,这意味着可以按允许查找位移值而无需筛选的方式对其进行排序。

  • 置换贴图类似于纹理贴图,但由顶点引擎访问。
  • 顶点管道的早期部分存在一个额外的采样器阶段,可以采样位移映射。 此阶段由通常的 SetSamplerState API 访问,但阶段编号为 D3DDMAPSAMPLER = 256。
  • 位移映射采样器状态可由 SetSamplerState (D3DDMAPSAMPLER, ...) API 设置。
  • 位移贴图纹理由 SetTexture (D3DDMAPSAMPLER、纹理) API 设置。
  • 地图可以预先采样或不采样。 这意味着可以按特定方式对它进行排序,以便无需筛选即可查找位移值。
  • 声明结构中的更改允许指定用于查找纹理贴图的纹理坐标。 例如,Stream0、Offset、FLOAT2、LOOKUP Displacement_value。 这会告知细化器使用 stream0 中特定偏移量的 2D 浮点矢量作为纹理坐标来查找位移贴图,并将Displacement_value用法语义关联到其中。 顶点着色器声明将包含一条类似于 {dcl_texture0 v0} 的行,指示纹理0 语义要与 v0 输入寄存器相关联。 查找的置换值将复制到输入寄存器 v0 中。
  • 对纹理贴图进行预采样时,有一种特殊类型的位移映射。 生成的顶点的顺序索引用作纹理贴图的纹理坐标。 例如,0,0, (D3DDECLTYPE) 0,D3DDECLMETHOD_LOOKUPPRESAMPLED,Usage,UsageIndex。
  • 查找的输出为 4 个浮点数。
  • 仅 N 补丁支持位移映射。
  • 如果驱动程序不处理位移映射,则需要忽略 SetTextureStageState 中的 D3DDMAPSAMPLER。
  • 不支持D3DTEXF_ANISOTROPIC筛选模式。
  • 当未D3DTEXF_NONE位移地图采样器中的D3DSAMP_MIPFILTER时,按如下方式计算详细程度 (请注意,即使D3DRS_ENABLEADAPTIVETESSELLATION为 FALSE) ,也会使用自适应分割状态:Tmax = 呈现状态D3DRS_MAXTESSELLATIONLEVEL
  • 计算顶点 Vi 的分割级别 Te: (Xi、Yi、Zi) 与“自适应分割”部分中所述的相同方式。 详细级别 L = log2 (Tmax) - log2 (Te) 。
  • 纹理筛选和采样操作遵循与像素管道相同的规则, (详细程度 (LOD) 偏差等) 。
  • 并非所有格式都可以用作位移映射,但只能用作支持D3DUSAGE_DMAP的格式。 应用程序可以使用 CheckDeviceFormat CheckDeviceFormat 进行查询。
  • 必须在 CreateTexture 中指定D3DUSAGE_DMAP,以通知驱动程序此纹理将用作位移贴图。
  • D3DUSAGE_DMAP只能与纹理一起使用。 它不能与多维数据集映射或卷一起使用。
  • 使用 D3DUSAGE_DMAP 创建的纹理和呈现目标可以在常规采样器阶段设置,并作为呈现目标进行设置。
  • 在位移映射中,将忽略用于为纹理坐标设置环绕模式的呈现状态。 通常,细化器引擎没有环绕模式。
  • 位移贴图采样器的行为与像素纹理采样器的行为相同。 如果查找少于四个通道的纹理 (如 R32f) ,则查找值将转到目标寄存器的适当通道 (标记有_sample语义) 的顶点着色器输入寄存器,而其他通道默认为 (1、1、1) 。 查找时,D3DFMT_L8广播到 R、G、B 通道,A 默认为 1。 参考光栅器具有完整的实现详细信息。

预采样位移映射

  • 引入了新的采样器状态:D3DSAMP_DMAPOFFSET (DWORD) - 预采样置换图中顶点) 偏移 (。
  • 引入了新的声明方法:D3DDECLMETHOD_LOOKUPPRESAMPLED。
  • 应禁用自适应分割。
  • 忽略纹理筛选器设置。 完成点采样。 假定 mip 纹理筛选器D3DTEXF_NONE。 假定所有其他纹理筛选器模式D3DTEXF_POINT。
  • 纹理坐标的计算方法为:U = (Index % TextureWidthInPixeles) / (float) (TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float) (TextureHeightInPixeles) 其中 Index 是生成的顶点加上 TSS[D3DSAMP_DMAPOFFSET] 的顺序索引。 顺序索引在每个基元的开头设置为零,并在生成顶点后增加。

这些是支持位移映射的 API 更改。

  • 添加了单通道格式,D3DFMT_L16。
  • 新的使用标志,D3DUSAGE_DMAP。
  • 用于设置位移贴图纹理的特殊纹理阶段,D3DDMAPSAMPLER。
  • 添加了新的硬件上限,D3DDEVCAPS2_DMAPNPATCH和D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH。 请参阅 D3DDEVCAPS2

顶点管道