次の方法で共有


ポイント スプライト (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で表されます。ビューポートの高さ (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 のビューポートの外側にあり、部分的に表示される可能性があります。

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

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)を参照してください。

頂点パイプライン