使用轉譯器階段消費者入門

本節說明如何設定檢視區、剪刀矩形、轉譯器狀態和多重取樣。

設定檢視區

檢視區會將裁剪空間中的頂點位置 (對應) 轉譯目標位置。 此步驟會將 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 和呼叫 ID3D11DeviceCoNtext::RSSetViewports來建立 640 × 480 檢視區。

    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 );

檢視區描述會指定檢視區的大小、使用 MinDepthMaxDepth) 將深度對應至 (的範圍,以及檢視區左上方的位置。 MinDepth 必須小於或等於 MaxDepth; MinDepthMaxDepth 的範圍介於 0.0 和 1.0 之間,包含。 檢視區通常會對應至轉譯目標,但並非必要;此外,檢視區不需要具有與轉譯目標相同的大小或位置。

您可以建立檢視區的陣列,但只有一個可以套用至幾何著色器的基本輸出。 一次只能設定一個檢視區使用中。 管線會使用預設檢視區 (和剪刀矩形,在下一節) 點陣化期間討論。 預設值一律是陣列中第一個檢視區 (或剪刀矩形) 。 若要在幾何著色器中執行檢視區的每個基本選取專案,請在 GS 輸出簽章宣告中適當 GS 輸出元件上指定 ViewportArrayIndex 語意。

任何一次可以系結至轉譯器階段的檢視區 (和剪刀) 矩形的最大數目是 D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE) 指定的 16 (。

設定剪刀矩形

剪刀矩形可讓您有另一個機會減少將傳送至輸出合併階段的圖元數目。 剪刀矩形外部的圖元會被捨棄。 剪刀矩形的大小是以整數指定。 在點陣化期間,系統值語意中只有一個 scissor 矩形 (以ViewportArrayIndex為基礎,) 套用至三角形。

若要啟用剪刀矩形,請使用D3D11_RASTERIZER_DESC1) 中的ScissorEnable成員 (。 預設剪刀式矩形是空的矩形;也就是說,所有 rect 值都是 0。 換句話說,如果您未設定剪刀矩形並啟用剪刀,則不會將任何圖元傳送至輸出合併階段。 最常見的設定是將剪刀矩形初始化為檢視區的大小。

若要將剪刀矩形的陣列設定為裝置,請使用D3D11_RECT呼叫ID3D11DeviceCoNtext::RSSetScissorRects

  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 輸出元件標示為系統產生的元件。 轉譯器階段會辨識此語意,並使用附加至 的參數做為剪刀矩形索引,以存取 scissor 矩形的陣列。 別忘了告訴轉譯器階段在建立轉譯器物件之前,先在轉譯器描述中啟用 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 到涵蓋範圍 ,或 (樣板作業無關,這些作業一律會針對每個樣本) 執行。

深度測試會受到多重取樣的影響:

  • 啟用多重取樣時,會針對每個樣本插入深度,而且每個樣本完成深度/樣板測試;所有傳遞樣本的圖元著色器輸出色彩都會重複。 如果圖元著色器輸出深度,則所有樣本的深度值都會重複 (,但此案例會失去多重取樣) 的優點。
  • 停用多重取樣時,深度/樣板測試仍會依樣本完成,但深度不會插入每個樣本。

在單一轉譯目標內混合多重取樣和非多重取樣轉譯沒有任何限制。 如果您啟用多重取樣並繪製到非多重取樣轉譯目標,則會產生與未啟用多重取樣相同的結果;取樣是使用每個圖元的單一樣本來完成。

轉譯器階段