Microsoft DirectX 8.0 (C++)

ポイント レンダリング

スクリーン空間サイズ 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)

これを次の図に示す。

クリッピングが有効にされている場合は、次の規則に従ってポイントがクリッピングされる。シーンがレンダリングされる深度の範囲 (D3DVIEWPORT8 構造体の MinZ および MaxZ) を頂点が超えている場合、ポイントは視錐台の外に存在し、レンダリングされない。ポイント サイズを考えに入れて、ポイントが完全に X および Y のビューポートの外に存在する場合、そのポイントはレンダリングされず、残りのポイントはレンダリングされる。ポイントの位置が X または Y のビューポートの外にあっても、部分的に表示できる場合がある。

ポイントは、ユーザー定義クリップ面に正しくクリップされる場合もあり、そうでない場合もある。D3DCAPS8PrimitiveMiscCaps メンバ内で D3DPMISCCAPS_CLIPPLANESCALEDPOINTS が設定されていない場合、ポイントは、頂点位置だけに基づき、ポイント サイズは無視して、ユーザー定義クリップ面にクリップされる。このとき、スケーリングされたポイントは、頂点位置がクリップ面の中にある場合は完全にレンダリングされ、頂点位置がクリップ面の外にある場合は破棄される。アプリケーションでは、最大ポイント サイズと同じ大きさの境界ジオメトリをクリップ面に追加することで、不自然な効果の発生を防ぐことができる。

D3DPMISCCAPS_CLIPPLANESCALEDPOINTS ビットが設定されている場合は、スケーリングされたポイントは、ユーザー定義クリップ面に正確にクリップされる。

ハードウェア頂点処理は、ポイント サイズをサポートしている場合もあり、そうでない場合もある。たとえば、D3DCAPS8 構造体の MaxPointSize メンバが 1.0 または 0.0 に設定されている、HAL デバイス (D3DDEVTYPE_HAL) 上の D3DCREATE_HARDWARE_VERTEXPROCESSING でデバイスを作成すると、すべてのポイントは単一ピクセルになる。1.0 より小さなピクセル ポイント スプライトをレンダリングするには、柔軟な頂点フォーマット (FVF)TL (トランスフォーム済みライティング済み) 頂点、またはソフトウェア頂点処理 (D3DCREATE_SOFTWARE_VERTEXPROCESSING) を使用する必要があり、この場合 Microsoft® Direct3D® ランタイムがポイント スプライト レンダリングをエミュレートする。FVF TL 頂点の詳細については、「トランスフォーム済み ライティング済みの頂点の機能」を参照すること。

頂点処理を実行し (MaxPointSize が1.0f より大きな値に設定された) ポイント スプライトをサポートするハードウェア デバイスは、トランスフォームされないスプライトのサイズ計算に必要であり、また TL 頂点の頂点ごとまたは D3DRS_POINTSIZE の設定を正しく行うためにも必要である。