ポイント スプライト (Direct3D 9)

Direct3D 9 でのポイント スプライトのサポートにより、ポイント (パーティクル システム) の高性能レンダリングが可能になります。 ポイント スプライトは、テクスチャによって定義された任意の図形をレンダリングできるようにする汎用ポイントの一般化です。

ポイント プリミティブ レンダリング コントロール

Direct3D 9 では、ポイント スプライト (ポイント プリミティブ) のレンダリングを制御するための追加パラメーターがサポートされています。 これらのパラメーターを使用すると、ポイントのサイズが可変になり、完全なテクスチャ マップが適用されます。 各ポイントのサイズは、Direct3D によって計算された距離ベースの関数と組み合わせたアプリケーション指定のサイズによって決まります。 アプリケーションでは、頂点ごとのポイント サイズを指定することも、頂点単位のサイズを持たないポイントに適用されるD3DRS_POINTSIZEを設定することもできます。 ポイント サイズは、変換後のフレキシブル頂点形式 (FVF) 頂点をアプリケーションが渡す場合を除き、カメラ空間単位で表されます。 この場合、距離ベースの関数は適用されず、ポイント サイズはレンダー ターゲット上のピクセル単位で表されます。

ポイントのレンダリング時に計算および使用されるテクスチャ座標は、D3DRS_POINTSPRITEENABLEの設定によって異なります。 この値を TRUE に設定すると、各ポイントに完全なテクスチャが表示されるようにテクスチャ座標が設定されます。 一般に、これはポイントが 1 ピクセルより大幅に大きい場合にのみ役立ちます。 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) は、次の 4 つの頂点の四角形としてラスター化されます。

(( 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 に設定されている場合、4 つの頂点のテクスチャ座標は次の値に設定されます。

(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 構造体の深度値 (シーンのレンダリング先の MinZ と MaxZ) の範囲を超えている場合、ポイントはビューの錐台の外側に存在し、レンダリングされません。 ポイントのサイズを考慮して、ポイントが X と Y のビューポートの外側に完全に存在する場合、ポイントはレンダリングされません。残りのポイントがレンダリングされます。 ポイント位置が X または Y のビューポートの外側にあり、部分的に表示される可能性があります。

ポイントは、ユーザー定義のクリップ平面に正しくクリップされる場合と、クリップされない場合があります。 D3DCAPS9 構造体の PrimitiveMiscCaps メンバーでD3DPMISCCAPS_CLIPPLANESCALEDPOINTSが設定されていない場合、ポイントは頂点の位置のみに基づいてユーザー定義のクリップ平面にクリップされ、ポイント サイズは無視されます。 この場合、頂点の位置がクリップ平面内にある場合は、スケールされたポイントが完全にレンダリングされ、頂点の位置がクリップ平面の外側にある場合は破棄されます。 アプリケーションは、最大ポイント サイズと同じ大きさのクリップ平面に境界線ジオメトリを追加することで、潜在的なアーティファクトを防ぐことができます。

D3DPMISCCAPS_CLIPPLANESCALEDPOINTS ビットが設定されている場合、スケールされたポイントは、ユーザー定義のクリッププレーンに正しくクリップされます。

ハードウェア頂点の処理では、ポイント サイズがサポートされる場合とサポートされていない場合があります。 たとえば、 D3DCAPS9 構造体の MaxPointSize メンバーが 1.0 または 0.0 に設定されているハードウェア抽象化レイヤー (HAL) デバイス (D3DDEVTYPE_HAL) でデバイスがD3DCREATE_HARDWARE_VERTEXPROCESSINGで作成された場合、すべてのポイントは 1 ピクセルになります。 1.0 未満のピクセル ポイント スプライトをレンダリングするには、FVF TL (変換および点灯) 頂点またはソフトウェア頂点処理 (D3DCREATE_SOFTWARE_VERTEXPROCESSING) を使用する必要があります。この場合、Direct3D ランタイムはポイント スプライトレンダリングをエミュレートします。

頂点処理を実行し、ポイント スプライト (MaxPointSize を 1.0f より大きい値に設定) をサポートするハードウェア デバイスは、変換されないスプライトのサイズ計算を実行するために必要であり、TL 頂点の頂点単位またはD3DRS_POINTSIZED3DRS_POINTSIZEを適切に設定する必要があります。

ポイント、線、三角形のレンダリング ルールの詳細については、「 ラスタライズ ルール (Direct3D 9)」を参照してください。

頂点パイプライン