1. 程式人生 > >D3D渲染技術之紋理

D3D渲染技術之紋理

紋理對映是一種將影象資料對映到三角形上的技術,從而能增加場景的細節和真實感。 例如,我們可以通過在每一側繪製板條紋理來構建一個立方體並將其轉換為板條箱如下圖所示。
在這裡插入圖片描述
在這裡給讀者教讀者如何學習紋理技術:
1、要了解如何指定對映到三角形的紋理部分。
2、瞭解如何建立和啟用紋理。
3、瞭解如何過濾紋理以建立更平滑的影象。
4、要了解如何使用地址模式多次平鋪紋理。
5、瞭解如何組合多個紋理以建立新紋理和特殊效果。
6、要學習如何通過紋理動畫建立一些基本效果。

紋理和資源回顧

回想一下,前面我們已經使用了紋理; 特別地,深度緩衝區和後臺緩衝區是由ID3D12Resource介面表示的2D紋理物件,D3D12_RESOURCE_DESC :: Dimension為D3D12_RESOURCE_DIMENSION_TEXTURE2D。
2D紋理是資料元素的矩陣, 2D紋理的一個用途是儲存2D影象資料,其中紋理中的每個元素儲存畫素的顏色。 但是,這不是唯一的用法; 例如,在法線貼圖的高階技術中,紋理中的每個元素都儲存3D向量而不是顏色, 因此,儘管將紋理視為儲存影象資料是常見的,但它們實際上更為通用。 1D紋理(D3D12_RESOURCE_DIMENSION_TEXTURE1D)類似於資料元素的1D陣列,3D紋理(D3D12_RESOURCE_DIMENSION_TEXTURE3D)類似於資料元素的3D陣列。 1D,2D和3D紋理介面均由通用ID3D12Resource表示。
紋理與緩衝區資源不同,緩衝區資源只儲存資料陣列;紋理可以具有mipmap級別,GPU可以對它們執行特殊操作,例如應用過濾器和多重取樣。由於紋理資源支援這些特殊操作,它們僅限於某種資料格式,而緩衝資源可以儲存任意資料。紋理支援的資料格式由DXGI_FORMAT列舉型別描述,一些示例格式是:
DXGI_FORMAT_R32G32B32_FLOAT
DXGI_FORMAT_R16G16B16A16_UNORM
DXGI_FORMAT_R32G32_UINT
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_R8G8B8A8_SNORM
DXGI_FORMAT_R8G8B8A8_SINT
請注意,R,G,B,A字母分別代表紅色,綠色,藍色和alpha。 但是,正如我們之前所說,紋理不需要儲存顏色資訊; 例如,格式
DXGI_FORMAT_R32G32B32_FLOAT
具有三個浮點元件,因此可以儲存具有浮點座標的3D向量(不一定是顏色向量), 還有無型別格式,我們只保留記憶體,然後指定當紋理繫結到渲染管道時如何在以後重新解釋資料(有點像轉換); 例如,以下無型別格式保留具有四個8位元件的元素,但不指定資料型別(例如,整數,浮點,無符號整數):
DXGI_FORMAT_R8G8B8A8_TYPELESS
注意,DirectX 11 SDK文件說:“建立完全型別的資源會將資源限制為使用它建立的格式。 這使執行時能夠優化訪問[…]。“因此,如果我們真的需要,應該只建立無型別資源; 否則,建立一個完全型別的資源。

紋理可以繫結到渲染管道的不同階段;一個常見的例子是使用紋理作為渲染目標(即Direct3D繪製到紋理中)和作為著色器資源(即,紋理將在著色器中取樣)。紋理既可以用作渲染目標,也可以用作著色器資源,但不能同時使用。渲染到紋理然後將其用作著色器資源,一種稱為渲染到紋理的方法允許一些有趣的特殊效果,我們將在後面使用它們。對於要用作渲染目標和著色器資源的紋理,我們需要為該紋理資源建立兩個描述符:
1)一個存在於渲染目標堆中(即D3D12_DESCRIPTOR_HEAP_TYPE_RTV)
2)存在於其中的一個著色器資源堆(即D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)。 (請注意,著色器資源堆還可以儲存常量緩衝區檢視描述符和無序訪問檢視描述符。)然後,資源可以繫結為渲染目標,或繫結為根簽名中的根引數的著色器輸入(但不在同時):

// Bind as render target.
CD3DX12_CPU_DESCRIPTOR_HANDLE rtv = …;
CD3DX12_CPU_DESCRIPTOR_HANDLE dsv = …;
cmdList->OMSetRenderTargets(1, &rtv, true, &dsv);
     
// Bind as shader input to root parameter.
CD3DX12_GPU_DESCRIPTOR_HANDLE tex = …;
cmdList->SetGraphicsRootDescriptorTable(rootParamIndex, tex);

資源描述符基本上做了兩件事:它們告訴Direct3D資源將如何使用(即,將繫結它的管道的哪個階段),如果資源格式在建立時被指定為無型別,那麼我們現在必須說明 在建立檢視時鍵入。 因此,對於無型別格式,紋理的元素可以在一個管道階段中被視為浮點值,而在另一個管道階段中被視為整數;這基本上相當於資料的重新解釋。