檢視區與裁剪

檢視區是一個二維 (2D) 矩形,3D 場景投影到其中。 在 Direct3D 中,矩形會以系統作為渲染目標使用的 Direct3D 表面內的座標存在。 投影轉換會將頂點轉換成用於檢視區的座標系統。 視窗也用於指定場景將渲染到的渲染目標表面上的深度值範圍 (通常為 0.0 到 1.0)。

檢視 Frustum

視錐體是場景中相對於視窗相機定位的 3D 體積。 體積的形狀會影響模型從相機空間投影到螢幕上的方式。 最常見的投影類型是透視投影,它使相機附近的物體看起來比遠處的物體更大。 對於透視觀察,視錐體可以視覺化為金字塔,相機位於尖端,如下圖所示。 此金字塔由前後剪裁平面相交。 金字塔內前剪平面和後剪平面之間的體積是視錐體。 物件僅當位於該體積中時才可見。

illustration of a viewing frustrum with a front and back clipping plan

如果您想像自己站在一個黑暗的房間裡並透過方形窗戶觀看,您正在想像一個視錐體。 在這個類比中,近剪裁平面是窗戶,後剪裁平面是最終幹擾您視線的任何東西 - 街對面的摩天大樓,遠處的山脈,或者什麼都沒有。 你可以看到截斷金字塔內的所有東西,從窗戶開始,到任何干擾你視野的東西結束,你看不到其他任何東西。

視錐體由 fov (視野) 以及前後剪裁平面的距離 (以 z 座標指定) 定義,如下圖所示。

diagram of the viewing frustum

在此圖中,變數 D 是從相機到幾何管道最後部分 (檢視變換) 中定義的空間原點的距離。 這是您排列檢視範圍限制的空間。 如需如何使用這個 D 變數來建置投影矩陣的資訊,請參閱投影轉換

檢視區矩形

視口結構體包含四個成員 (X、Y、寬度、高度),它們定義場景將渲染到的渲染目標表面的區域。 這些值對應於目標矩形或視窗矩形,如下圖所示。

diagram of the viewport rectangle

您為 X、Y、Width、Height 成員指定的值是相對於渲染目標表面左上角的螢幕座標。 該結構定義了兩個附加成員 (MinZ 和 MaxZ),它們指示場景將渲染到的深度範圍。

Direct3D 假定 X 方向的視窗裁切體積範圍為 -1.0 到 1.0,Y 方向的視窗裁切體積範圍為 1.0 到 -1.0。這些是過去應用程式最常使用的設定。 您可以在使用投影變換進行剪輯之前調整視口縱橫比。

注意 MinZ 和 MaxZ 表示將呈現場景的深度範圍,且不會用於裁剪。 大多數應用程式會將這些值設為 0.0 和 1.0,以使系統能夠渲染深度緩衝區中的整個深度值範圍。 在某些情況下,您可以透過使用其他深度範圍來實現特殊效果。 例如,要在遊戲中渲染平視顯示器,您可以將兩個值都設為 0.0,以強制系統在前景中渲染場景中的對象,或者您可以將它們都設為 1.0 以渲染應始終位於背景的物件。

 

視口結構體的 X、Y、Width、Height 成員中使用的尺寸定義了渲染目標表面上視窗的位置和尺寸。 這些值位於螢幕座標中,相對於表面左上角。

Direct3D 使用視窗位置和尺寸來縮放頂點,以使渲染的場景適合目標表面上的適當位置。 在內部,Direct3D 會將這些值插入下列套用至每個頂點的矩陣中。

equation of the matrix that is applied to each vertex

此矩陣根據視口尺寸和所需深度範圍縮放頂點,並將它們轉換到渲染目標表面上的適當位置。 此矩陣也會翻轉 y 座標以反映左上角的螢幕原點,並且 y 向下增加。 在應用此矩陣後,頂點仍然是齊次的 - 也就是說,它們仍然作為 [x,y,z,w] 頂點存在 - 並且在發送到光柵器之前必須將它們轉換為非齊次座標。

注意 應用程式通常會將MinZ和 MaxZ分別設定為0.0和1.0,讓系統渲染到整個深度範圍。 但是,您可以使用其他值來實現某些效果。 例如,您可以將這兩個值都設為 0.0 以強制所有物件進入前景,或者將這兩個值都設為 1.0 以將所有物件渲染到背景中。

 

清除檢視區

清除視窗會重設渲染目標表面上視窗矩形的內容。 它也可以清除深度和樣板緩衝區表面的矩形。

設定剪貼的檢視區

投影矩陣的結果決定投影空間中的裁切體積為:

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

其中:x、y、z 和 w 表示應用投影變換後的頂點座標。 如果啟用了剪切 (預設行為),則具有超出這些範圍的 x、y 或 z 分量的任何頂點都會被剪切。

座標系統與幾何