点子画面 (Direct3D 9)

支持 Direct3D 9 中的点子画面可实现 (粒子系统) 的高性能渲染。 点子画面是泛型点的通用化,使任意形状能够按纹理定义呈现。

点基元呈现控件

Direct3D 9 支持其他参数来控制点子画面 (点基元) 的呈现。 这些参数使点的大小可变,并且应用了完整的纹理贴图。 每个点的大小由应用程序指定的大小与 Direct3D 计算的基于距离的函数相结合来确定。 应用程序可以将点大小指定为每个顶点,也可以通过设置D3DRS_POINTSIZE来指定点大小,这适用于没有每个顶点大小的点。 点大小以相机空间单位表示,除了应用程序传递帖子转换的灵活顶点格式 (FVF) 顶点时除外。 在这种情况下,不应用基于距离的函数,并且点大小以像素为单位表示呈现目标。

呈现点时计算和使用纹理坐标取决于D3DRS_POINTSPRITEENABLE的设置。 当此值设置为 TRUE 时,将设置纹理坐标,以便每个点显示完整的纹理。 一般情况下,仅当点明显大于一个像素时,这才有用。 当D3DRS_POINTSPRITEENABLE设置为 FALSE 时,每个点的顶点纹理坐标将用于整个点。

点大小计算

点大小由D3DRS_POINTSCALEENABLE决定。 如果此值设置为 FALSE,则应用程序指定的点大小将用作屏幕空间 (帖子转换) 大小。 传递到屏幕空间中的 Direct3D 的顶点没有计算点大小;指定的点大小解释为屏幕空间大小。

如果D3DRS_POINTSCALEENABLE为 TRUE,Direct3D 将根据以下公式计算屏幕空间点大小。 应用程序指定的点大小以相机空间单位表示。

S s = Vh * S i * sqrt (1/ (A + B * D ₑ + C * ( D ₑー ) ) )

在此公式中,输入点大小 S i 是每个顶点或D3DRS_POINTSIZE呈现状态的值。 点刻度系数(D3DRS_POINTSCALE_A、D3DRS_POINTSCALE_B和D3DRS_POINTSCALE_C)由 A、B 和 C 点表示。视区的高度 V h 是表示视区 D3DVIEWPORT9 结构的 Height 成员。 D ₑ,从眼睛到 (眼睛在原点) 的位置,通过获取点 (Xₑ、Yₑ、Zₑ) 和执行以下操作来计算。

D ₑ = sqrt (Xₑー + Y ₑー + Z ₑー)

最大点大小(Pmₐₓ)通过采用 D3DCAPS9 结构的 MaxPointSize 成员或D3DRS_POINTSIZE_MAX呈现状态的较小来确定。 最小点大小 Pmin 通过查询D3DRS_POINTSIZE_MIN的值来确定。 因此,最终屏幕空间点大小 S 按以下方式确定。

  • 如果 Ss > Pmₐₓ,则 S = P mₐₓ
  • 如果 S Pmin,则 S < = P min
  • 否则,S = S s

点渲染

屏幕空间点 P = ( X、Y、Z、W) ,屏幕空间大小 S 的光栅化为以下四个顶点的四边形。

( ( X + S/2、Y + S/2、Z、W) 、 ( X + S/2、Y - S/2、Z、W) 、 ( X - S/2、Y-S/2、Z、W) 、 ( X - S/2、Y + S/2、Z、W) )

顶点颜色属性在每个顶点上重复;因此,每个点始终以常量颜色呈现。

纹理索引的分配由D3DRS_POINTSPRITEENABLE呈现状态设置控制。 如果D3DRS_POINTSPRITEENABLE设置为 FALSE,则会在每个顶点复制顶点纹理坐标。 如果D3DRS_POINTSPRITEENABLE设置为 TRUE,则四个顶点处的纹理坐标将设置为以下值。

(0.F、0.F) 、 (0.F、1.F) 、 (1.F、0.F) 、 (1.F、1.F)

下图显示了此特点。

diagram of a square with labeled vertices for (u,v) and (x,y) coordinate values

启用剪辑后,按以下方式剪裁点。 如果顶点超出 D3DVIEWPORT9 结构的深度值范围 (D3DVIEWPORT9 结构的 MinZ 和 MaxZ),则此点存在于视面外部且未呈现。 如果点(考虑到点大小)完全超出 X 和 Y 的视区,则不会呈现该点:剩余的点呈现。 点位置可能位于 X 或 Y 的视区之外,并且仍然部分可见。

点可能或无法正确剪裁到用户定义的剪辑平面。 如果未在 D3DCAPS9 结构的 PrimitiveMiscCaps 成员中设置D3DPMISCCAPS_CLIPPLANESCALEDPOINTS,则仅根据顶点位置将点裁剪为用户定义的剪辑平面,忽略点大小。 在这种情况下,当顶点位于剪辑平面内时,缩放点将完全呈现,当顶点位置在剪辑平面外时被丢弃。 应用程序可以通过向剪辑平面添加边框几何图形来阻止潜在的项目,这些平面的大小与最大点大小一样大。

如果设置了D3DPMISCCAPS_CLIPPLANESCALEDPOINTS位,则会将缩放点正确剪裁到用户定义的剪辑平面。

硬件顶点处理可能或可能不支持点大小。 例如,如果在硬件抽象层 (HAL) (D3DDEVTYPE_HAL) 设备上 D3DCREATE_HARDWARE_VERTEXPROCESSING创建了具有 D3DCAPS9 结构的 MaxPointSize 成员设置为 1.0 或 0.0 的设备,则所有点都是单个像素。 若要呈现小于 1.0 的像素点子画面,必须使用 FVF TL (转换并点亮) 顶点或软件顶点处理 (D3DCREATE_SOFTWARE_VERTEXPROCESSING) ,在这种情况下,Direct3D 运行时模拟点子画面呈现。

执行顶点处理并支持点子画面(MaxPointSize 设置为大于 1.0f)的硬件设备需要执行非转换子画面的大小计算,并且需要正确设置 TL 顶点的每个顶点或D3DRS_POINTSIZED3DRS_POINTSIZE。

有关点、线条和三角形的呈现规则的信息,请参阅 光栅化规则 (Direct3D 9)

顶点管道