Point Sprites (Direct3D 9)

支援 Direct3D 9 中的點 Sprite 可讓 (物件系統) 的高效能轉譯點。 點 Sprite 是泛型點的一般化,可讓任意圖形轉譯為紋理所定義。

點基本轉譯控制項

Direct3D 9 支援其他參數,以控制點 sprite (點基本類型) 的轉譯。 這些參數可讓點成為可變大小,並套用完整的紋理貼圖。 每個點的大小取決於應用程式指定的大小,結合 Direct3D 所計算的以距離為基礎的函式。 應用程式可以將點大小指定為個別頂點,或藉由設定D3DRS_POINTSIZE來指定點大小,這會套用至沒有每個頂點大小的點。 點大小是以相機空間單位表示,但應用程式在 FVF) 頂點 (傳遞轉換後彈性頂點格式時除外。 在此情況下,不會套用以距離為基礎的函式,而且點大小是以圖元為單位來表示轉譯目標。

轉譯點時計算及使用的紋理座標取決於D3DRS_POINTSPRITEENABLE的設定。 當此值設定為 TRUE時,會設定紋理座標,讓每個點顯示完整的紋理。 一般而言,這只有在點明顯大於一個圖元時才有用。 當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) ,螢幕空間大小的 S 會點陣化為下列四個頂點的四邊形。

( ( 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,則四個頂點的紋理座標會設定為下列值。

(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位,則縮放點會正確地裁剪為使用者定義的裁剪平面。

硬體頂點處理可能或可能不支援點大小。 例如,如果在硬體抽象層上建立裝置D3DCREATE_HARDWARE_VERTEXPROCESSING, (HAL) 裝置 (D3DDEVTYPE_HAL) 且 D3DCAPS9 結構的 MaxPointSize 成員設定為 1.0 或 0.0,則所有資料點都是單一圖元。 若要轉譯小於 1.0 的圖元點 Sprite,您必須使用 FVF TL (轉換和光線) 頂點或軟體頂點處理 (D3DCREATE_SOFTWARE_VERTEXPROCESSING) ,在此情況下,Direct3D 執行時間會模擬點 Sprite 轉譯。

執行頂點處理並支援點 Sprite - MaxPointSize 設定為大於 1.0f 的硬體裝置,必須執行非轉換 Sprite 的大小計算,而且必須正確設定 TL 頂點的每個頂點或D3DRS_POINTSIZED3DRS_POINTSIZE。

如需點、線條和三角形轉譯規則的相關資訊,請參閱 Direct3D 9 (點陣化規則)

頂點管線