開始使用光柵化器階段
本節說明設定視口、剪刀矩形、光柵化器狀態和多重取樣。
設定檢視區
視窗會將頂點位置(在裁剪空間中)映射到渲染目標位置。 此步驟會將 3D 位置調整為 2D 空間。 在轉譯目標中,Y 軸是向下指的;這需要在視口縮放時將 Y 座標反轉。 此外,x 和 y 範圍(x 和 y 值的範圍)會根據下列公式來調整以符合檢視區大小:
X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth)
教學課程 1 會使用 D3D11_VIEWPORT 建立 640 × 480 檢視區,並呼叫 ID3D11DeviceContext::RSSetViewports。
D3D11_VIEWPORT vp[1];
vp[0].Width = 640.0f;
vp[0].Height = 480.0f;
vp[0].MinDepth = 0;
vp[0].MaxDepth = 1;
vp[0].TopLeftX = 0;
vp[0].TopLeftY = 0;
g_pd3dContext->RSSetViewports( 1, vp );
檢視區描述會指定檢視區的大小、映射深度範圍(使用 MinDepth 和 MaxDepth),以及檢視區左上角的位置。 MinDepth 必須小於或等於 MaxDepth;MinDepth 和 MaxDepth 的範圍介於 0.0 和 1.0 之間。 檢視區通常會對應至轉譯目標,但並非必要;此外,檢視區不需要與轉譯目標具有相同的大小或位置。
您可以建立檢視區陣列,但只能將一個套用至幾何著色器的基本輸出。 一次只能啟用一個檢視區。 管線會在點陣化期間使用預設檢視區(以及下一節所討論的剪刀矩形)。 預設值通常是陣列中的第一個檢視視窗(或剪裁矩形)。 若要在 geometry 著色器中執行檢視區的每個基本選取專案,請在 GS 輸出簽章宣告中的適當 GS 輸出元件上指定 ViewportArrayIndex 語意。
任何時間可以綁定到光柵化階段的檢視區(和剪刀矩形)數目上限為16(由 D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE指定)。
設定剪刀矩形
剪刀矩形可讓您再有機會減少將傳送至輸出合併階段的像素數目。 剪刀矩形外的圖元會被捨棄。 剪刀矩形的大小是以整數指定。 在光柵化過程中,依據 ViewportArrayIndex系統值語意,只能將一個剪刀矩形套用至三角形。
若要啟用剪刀矩形,請使用 ScissorEnable 成員(在 D3D11_RASTERIZER_DESC1中)。 默認剪刀矩形是空的矩形;也就是說,所有 rect 值都是 0。 換句話說,如果您未設定剪刀矩形並啟用剪刀,則不會將任何像素傳送至輸出合併階段。 最常見的設定是將剪刀矩形初始化為檢視區的大小。
若要將剪刀矩形陣列設定到裝置,請呼叫 ID3D11DeviceContext::RSSetScissorRects, 並使用 D3D11_RECT。
D3D11_RECT rects[1];
rects[0].left = 0;
rects[0].right = 640;
rects[0].top = 0;
rects[0].bottom = 480;
g_pd3dContext->RSSetScissorRects( 1, rects );
此方法採用兩個參數:(1) 陣列中的矩形數目,以及矩形陣列 (2) 。
管線會在點陣化期間使用預設剪刀矩形索引(預設值為停用裁剪的零大小矩形)。 若要覆寫此設定,請在 GS 輸出簽章宣告中指定 GS 輸出元件的 SV_ViewportArrayIndex 語意。 這會導致 GS 階段將此 GS 輸出元件標示為具有此語意的系統產生元件。 轉譯器階段會辨識此語意,並使用附加參數做為剪刀矩形索引,以存取剪刀矩形的陣列。 別忘了在建立柵格化物件之前,啟用柵格化描述中的 ScissorEnable 值,以告訴柵格化階段使用您定義的裁剪矩形。
設定光柵化器狀態
從 Direct3D 10 開始,轉譯器狀態會封裝在轉譯器狀態物件中。 您最多可以建立 4096 個光柵狀態物件,然後透過將操作碼傳遞給狀態物件,來將其設定到裝置。
使用 ID3D11Device1::CreateRasterizerState1 從轉譯器描述建立轉譯器狀態物件(請參閱 D3D11_RASTERIZER_DESC1)。
ID3D11RasterizerState1 * g_pRasterState;
D3D11_RASTERIZER_DESC1 rasterizerState;
rasterizerState.FillMode = D3D11_FILL_SOLID;
rasterizerState.CullMode = D3D11_CULL_FRONT;
rasterizerState.FrontCounterClockwise = true;
rasterizerState.DepthBias = false;
rasterizerState.DepthBiasClamp = 0;
rasterizerState.SlopeScaledDepthBias = 0;
rasterizerState.DepthClipEnable = true;
rasterizerState.ScissorEnable = true;
rasterizerState.MultisampleEnable = false;
rasterizerState.AntialiasedLineEnable = false;
rasterizerState.ForcedSampleCount = 0;
g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );
這個狀態組範例可能完成最基本的光柵化器設定:
- 實心填滿模式
- 剔除或移除背面;假設圖元以逆時針順序排列
- 關閉深度偏差,但啟用深度緩衝並啟用剪刀矩形
- 關閉多重取樣和線條防鋸齒
此外,基本光柵化器作業一律包含下列項目:裁剪(至視景體)、透視除法和檢視區縮放。 成功建立光柵化器狀態物件之後,請將它設定為裝置,如下所示:
g_pd3dContext->RSSetState(g_pRasterState);
多重取樣
多重取樣會以較高解析度取樣影像的部分或全部元件(隨後再降樣到原始解析度),從而減少由繪製多邊形邊緣造成的顯著鋸齒現象。 雖然多重取樣需要子圖元樣本,但新式 GPU 會實作多重取樣,讓圖元著色器每像素執行一次。 這可在效能(特別是在 GPU 綁定應用程式中)與最終映像的消除鋸齒之間提供可接受的取捨。
若要使用多重取樣,請在 點陣化描述中設定 enable 字段,、建立多重取樣轉譯目標,並使用著色器讀取轉譯目標,以將樣本解析成單一圖元色彩,或呼叫 ID3D11DeviceContext::ResolveSubresource,以使用視訊卡解析樣本。 最常見的情境是繪製到一個或多個多重取樣渲染目標。
多重取樣與是否使用樣本遮罩無關,啟用alpha到涵蓋範圍,或樣本作業(一律執行每個樣本)。
深度測試會受到多重取樣的影響:
- 啟用多重取樣時,每個樣本會插補深度,而深度/模板測試則是每個樣本完成,所有通過測試的樣本都會複製圖元著色器輸出色彩。 如果圖元著色器輸出深度,則所有樣本都會複製深度值(雖然此案例會失去多重取樣的優點)。
- 停用多重取樣時,深度/模板測試仍然逐取樣執行,但深度不會逐取樣插補。
在單一渲染目標中混合多重取樣和非多重取樣渲染沒有任何限制。 如果您啟用了多重採樣但繪製到非多重採樣的渲染目標,將會產生與未啟用多重採樣相同的結果;取樣將以每個像素一個樣本的方式進行。
相關主題