计算点精灵的大小

使用现有的 D3DPT_POINT 基元类型呈现点子画面。 可以通过新的呈现状态 D3DRS_POINTSIZE 或新的 FVF 组件 D3DFVF_PSIZE 控制子画面的大小。

对于没有 D3DFVF_PSIZE 顶点组件的顶点,应使用 D3DRS_POINTSIZE 呈现状态的当前值。 否则,应使用顶点数据中指定的值。 在任一情况下,值都是一个浮点数,它是呈现的四个呈现目标像素 (宽度和高度) 的大小。 在初始化期间,点大小呈现状态 (1.0) 的默认值将发送给驱动程序。

两个呈现状态控制钳位的计算点动画大小,D3DRS_POINTSIZE_MIN 和 D3DRS_POINTSIZE_MAX。 应将该点的计算大小限制为不小于 D3DRS_POINTSIZE_MIN 给定的大小,并且不会大于 D3DRS_POINTSIZE_MAX 给出的大小。 驱动程序的责任是确保将点动画大小限制到渲染状态指定的最小大小和最大大小。

对于支持硬件顶点处理的驱动程序,点 sprite 的大小还可以根据) 中点与眼睛 (的距离进行缩放。 点 sprite 的缩放通过新的呈现状态 D3DRS_POINTSCALEENABLE 启用。 如果此呈现状态的值为 TRUE ,则根据以下参数、Ss 公式和最大/最小值决定缩放点。 请注意,在这种情况下,应用程序指定的点大小用相机空间单位表示。 此缩放由仅支持转换和照明的驱动程序执行。

Si
输入点大小 (为每个顶点或 D3DRS_POINTSIZE)

A、B、C
点缩放系数 D3DRS_POINTSCALEA/B/C

Vh
D3D_VIEWPORT) 中 (dwHeight 字段的视区高度

P ₑ = (X ₑ,Y ₑ,Z ₑ)
点的目视空间位置

De = sqrt (X ₑ² + Y ₑ² + Z ₑ²)
从眼睛到位置 (眼的距离)

Ss = Vh * Si * sqrt (1/ (A + B * d ₑ + C * (d ₑ²) ) )
屏幕空间点大小

Smax
MaxPointSize (D3DCAPS8) 设备功能的成员

Smin
D3DRS_POINTSIZE_MIN

最终屏幕空间点大小 S =
Smax if Ss > Smax

Smin if Ss < Smin

Ss,否则

请注意,对于要绘制单像素顶点的应用程序,不应使用点子画面,它必须设置以下渲染状态:

SetRenderState (D3DRS_POINTSCALEENABLE, FALSE)
// All textures must be turned off.
SetTexture (0, NULL); 
SetTextureStageState(1, D3DTSS_COLOROP,  D3DTOP_DISABLE);
// The point size render state must be set to any value between 0.0-1.0
SetRenderState(D3DRS_POINTSIZE, 1.0);
// D3DRS_POINTSIZE_MIN and D3DRS_POINTSIZE_MAX
// must be set appropriately to allow
// D3DRS_POINTSIZE to be set to a value between 0.0-1.0