2011-05-31 32 views
1

我試圖使用ID3D11Texture2D上的模板緩衝將一個紋理的一部分覆蓋在另一個紋理上。我打算通過在模板緩衝區上繪製所需的形狀然後複製紋理來完成此操作。請爲2D紋理的示例代碼提供一些很好的教程,以瞭解模板緩衝區的用法。 (或者這樣的一些替代方式)在Direct3D中使用模板緩衝

+0

請一些人給我一個鏈接,使用'模板Buffer'的'Direct3D'一個很好的教程有一些基本的例子一樣掩蔽像素。 – 2011-05-31 12:29:40

回答

13

模板掩模101:

  • 所有主流的GPU使用8位模板緩衝,以及它們被設置到深度緩衝區,所以你必須選擇一個緩衝格式包括模板(D24S8主要)
  • 清除深度和模板都爲每幀的開頭,以避免幀間的性能問題*(參見下面的註釋)
  • 除非你知道自己在做什麼,用0xFF的用於讀取和寫掩碼在任何時候。
  • 出於性能方面的考慮,不會做模版讀取測試
  • 出於性能的考慮,當啓用深度寫作,如果可能的話,保持模板讀限於== 0和!= 0的測試,並清零
  • 如果您使用的是D3D9,您可以使用剪刀矩形和清除模板緩衝區,這比手動渲染四邊形以將緩衝區設置回零快很多。
  • 無法在着色器中訪問模板信息,所以後處理效果無法確定相鄰像素的模板狀態,而不將遮罩置於正常的渲染目標中並作爲紋理進行採樣。
  • 模版緩衝器值可以從下面的條件進行修改:
    1. 模版測試失敗
    2. 深度測試失敗
    3. 的模板及深度測試均通過
  • 無論條件是首先確定該動作可以是
    1. 保留(僅留下模板值)
    2. 替換
    3. 增量(添加1至當前緩衝區)
    4. 遞減(從模版緩衝器子1)
    5. 零(與「stencilref」值來替換模板值)(直接零設置的值,當其他條件之一需要使用當前stencilref值)

*不遵守大多數這些規則通常會導致最壞的情況下模具性能非常有用:您的像素着色器執行每個像素,而不是爲模板蒙版像素執行提前拒絕。此外,在較舊的Geforce卡上,這也可能導致所有後續繪製調用的早期深度拒絕的破壞,直到下一個幀或深度緩衝區模板被清除後纔會被修復。

模板面具其實是很容易產生:

  • 清除模板緩存
  • (與stencilref 1或代替「保持」增量'替換')啓用模板編寫模板狀態
  • 繪製一個多邊形。需要注意的是,在着色器使用「取消」將防止更新模板,這是你如何載入紋理到模板緩存(但只作爲一個二元掩模)

  • 禁用模板寫,使模板測試

  • (理想情況下)也關閉深度寫入
  • 畫出你的效果,需要模板掩蔽
+0

謝謝,如果您可以給我一些代碼示例,說明如何在D3D11中使用模板緩衝區來實現一些基本效果,那麼這將非常有用。 – 2011-06-21 05:43:09