D3D12渲染技術之紋理案例

2021-08-28 16:55:58 字數 2118 閱讀 8343

我們現在回顧一下將紋理新增到箱子模型上面,就跟以前的部落格中提到的那樣。下面我們詳細介紹如何實現?

geometrygenerator :: createbox生成箱子的紋理座標,以便將整個紋理影象對映到箱子的每個面上。 為簡潔起見,我們僅顯示正面,背面和頂面的頂點定義。 另請注意,我們省略了頂點建構函式中法線和切線向量的座標(紋理座標以粗體顯示)。

geometrygenerator::meshdata geometrygenerator::createbox(

float width, float height, float depth,

uint32 numsubdivisions);

std::unordered_map> mtextures;

我們將所有獨特紋理儲存在無序地圖中,以便我們可以按名稱查詢它們。 在**中,在載入紋理之前,需要檢查紋理資料是否已經載入(即,它是否已經包含在無序對映中),以便它不會多次載入。

一旦建立了紋理並在描述符堆中為它建立了srv,將紋理繫結到管道以便可以在著色器程式中使用它只需將其設定為需要紋理的根簽名引數:

// get srv to texture we want to bind.

cd3dx12_gpu_descriptor_handle tex(

msrvdescriptorheap->getgpudescriptorhandleforheapstart());

tex.offset(ri->mat->diffusesrvheapindex, mcbvsrvdescriptorsize); …

// bind to root parameter 0. the root parameter description specifies which

// shader register slot this corresponds to.

cmdlist->setgraphicsrootdescriptortable(0, tex);

我們沒有討論過的兩個常量緩衝區變數是gtextransform和gmattransform。 這些變數在頂點著色器中用於變換輸入紋理座標:

在這裡插入**片// output vertex attributes for interpolation across ********.

float4 texc = mul(float4(vin.texc, 0.0f, 1.0f), gtextransform);

vout.texc = mul(texc, gmattransform).xy;

紋理座標表示紋理平面中的2d點, 因此,我們可以像任何其他點一樣平移,旋轉和縮放它們, 以下是轉換紋理的一些示例用法:

1、磚紋理沿牆壁被拉伸, 牆頂點當前具有範圍[0,1]中的紋理座標。 我們將紋理座標放大4倍,以將它們放大到範圍[0,4],這樣紋理將在牆上重複四到四次。

2、天空飄動的雲層, 通過將紋理座標轉換為時間的函式,雲在天空上就可以飄動了。

3、紋理旋轉有時對粒子效果非常有用,例如,我們會隨著時間的推移旋轉火球紋理。

在本篇部落格提供的案例中,我們使用單位矩陣變換,以便輸入紋理座標保持不變,但在下篇部落格中,我們將解釋使用紋理變換的演示。

請注意,要將2d紋理座標轉換為4×4矩陣,我們將其擴充套件為4d向量:

vin.texc ---> float4(vin.tex, 0.0f, 1.0f)
在乘法完成之後,通過丟棄z分量和w分量將得到的4d向量轉回到2d向量。

vout.texc = mul(float4(vin.texc, 0.0f, 1.0f), gtextransform).xy;
我們使用兩個單獨的紋理變換矩陣gtextransform和gmattransform,因為有時它對材質轉換紋理(對於像水這樣的動畫材料)更有意義,但有時它使紋理變換更有意義成為物件的屬性。

因為我們正在處理2d紋理座標,所以我們只關心對前兩個座標進行的轉換。 例如,如果紋理矩陣轉換了z座標,則它對結果紋理座標沒有影響。最後給大家看一下實現的demo:

D3D12渲染技術之渲染管線

渲染管線指的是通過虛擬相機看到的內容生成2d影象的整個步驟序列,在部落格d3d12渲染技術概述中介紹過渲染管線,本篇部落格具體講解各個模組的作用,先看下圖所示 上圖中input assembler stage表示的是從儲存器讀取幾何資料 頂點和索引 並使用它來組裝幾何圖元 例如,三角形,線條 簡單地...

D3D12渲染技術之過濾

紋理貼圖的元素是來自連續影象的離散顏色樣本,它們不是帶有區域的矩形。所以問題是 如果我們的紋理座標 u,v 與其中乙個紋理畫素點不一致,會發生什麼?這可能發生以下情況。假設放大場景中的牆壁,使牆壁覆蓋整個螢幕,例如,假設顯示器解析度為1024 1024,牆壁的紋理解析度為256 256,這說明紋理放...

D3D12渲染技術之在著色器中取樣

我們直奔主題,紋理物件在hlsl中定義,並使用以下語法分配給紋理暫存器 texture2d gdiffusemap register t0 這個換成在unity引擎或者ue4引擎中就是提供的視覺化操作介面,而在dx中的表示是按照上面的寫法,這樣可以通過引擎對其進行賦值操作。請注意,紋理暫存器使用由t...