ポイント スプライト (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

ポイント レンダリング

画面空間サイズ 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)

これを次の図に示します。

(u,v) 座標値と (x,y) 座標値のラベル付き頂点を含む四角形の図

クリッピングが有効になっている場合、ポイントは次のようにクリップされます。 頂点が、シーンをレンダリングする 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)」を参照してください。

頂点パイプライン