点子画面 (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 < P分钟,则 S = P 分钟
- 否则,S = S
点渲染
屏幕空间大小 S 的屏幕空间点 P = ( X、Y、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) 、 ( 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)
下图显示了此特点。
启用剪裁时,将按以下方式剪裁点。 如果顶点超出了要呈现场景的 D3DVIEWPORT9 结构的深度值范围(MinZ 和 MaxZ),则点存在于视图视锥之外,并且不会呈现。 如果点(考虑到点大小)完全在 X 和 Y 的视区之外,则不呈现该点;其余点将呈现。 点位置可能位于 X 或 Y 的视区之外,并且仍然部分可见。
点可能已正确剪辑到用户定义的剪裁平面,也可能不一定正确。 如果未在 D3DCAPS9 结构的 PrimitiveMiscCaps 成员中设置D3DPMISCCAPS_CLIPPLANESCALEDPOINTS,则仅根据顶点位置将点裁剪为用户定义的剪裁平面,忽略点大小。 在这种情况下,当顶点位置位于剪裁平面内时,将完全呈现缩放点,当顶点位置位于剪裁平面之外时,将放弃缩放点。 应用程序可以通过向与最大点大小一样大的剪裁平面添加边框几何图形来防止潜在的项目。
如果设置了D3DPMISCCAPS_CLIPPLANESCALEDPOINTS位,则会正确地将缩放点剪裁到用户定义的剪裁平面。
硬件顶点处理可能支持点大小,也可能不支持点大小。 例如,如果在将 D3DCAPS9 结构的 MaxPointSize 成员设置为 D3DCREATE_HARDWARE_VERTEXPROCESSING 1.0 或 0.0 的硬件抽象层 (HAL) 设备 (D3DDEVTYPE_HAL) 上创建设备,则所有点都是单个像素。 若要呈现小于 1.0 的像素点子画面,必须使用 FVF TL (转换和点亮) 顶点或软件顶点处理 (D3DCREATE_SOFTWARE_VERTEXPROCESSING) ,在这种情况下,Direct3D 运行时模拟点子画面呈现。
执行顶点处理并支持点子画面的硬件设备(MaxPointSize 设置为大于 1.0f)需要为非转换子画面执行大小计算,并且需要正确设置 TL 顶点的每个顶点或D3DRS_POINTSIZED3DRS_POINTSIZE。
有关点、线和三角形的呈现规则的信息,请参阅光 栅化规则 (Direct3D 9) 。
相关主题