点子画面 (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(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、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)

下图显示了这种情况。

带有标记顶点的正方形的图示(u,v)和(x,y)坐标值

启用剪辑后,将按以下方式剪裁点。 如果顶点超出 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)

顶点管道