计算点精灵的大小

使用现有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提供的大小。 驱动程序负责确保将点子画面大小固定到呈现状态指定的最小和最大大小。

对于支持硬件顶点处理的驱动程序,还可以根据从点到眼睛的距离缩放点子画面的大小, (眼睛空间) 。 点子画面的缩放由新的呈现状态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 Sₛ > Smax

Smin if Sₛ < 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