我們直奔主題,紋理物件在hlsl中定義,並使用以下語法分配給紋理暫存器:
texture2d gdiffusemap : register(t0);
這個換成在unity引擎或者ue4引擎中就是提供的視覺化操作介面,而在dx中的表示是按照上面的寫法,這樣可以通過引擎對其進行賦值操作。
請注意,紋理暫存器使用由tn指定,其中n是標識紋理暫存器槽的整數,根簽名定義指定從slot引數到著色器暫存器的對映, 這是應用程式**如何將srv繫結到著色器中的特定texture2d物件。
類似地,取樣器物件定義為hlsl,並使用以下語法分配給取樣器暫存器:
samplerstate gsampointwrap : register(s0);
samplerstate gsampointclamp : register(s1);
samplerstate gsamlinearwrap : register(s2);
samplerstate gsamlinearclamp : register(s3);
samplerstate gsamanisotropicwrap : register(s4);
samplerstate gsamanisotropicclamp : register(s5);
這些取樣器對應於我們在上篇部落格中設定的靜態取樣器陣列, 請注意,紋理暫存器使用sn指定,其中n是標識取樣器暫存器槽的整數。
現在,給定畫素著色器中畫素的一對紋理座標(u,v),我們實際使用texture2d :: sample方法對紋理進行取樣:
texture2d gdiffusemap : register(t0);
samplerstate gsampointwrap : register(s0);
samplerstate gsampointclamp : register(s1);
samplerstate gsamlinearwrap : register(s2);
samplerstate gsamlinearclamp : register(s3);
samplerstate gsamanisotropicwrap : register(s4);
samplerstate gsamanisotropicclamp : register(s5);
struct vertexout;
float4 ps(vertexout pin) : sv_target
{float4 diffusealbedo = gdiffusemap.sample(gsamanisotropicwrap, pin.texc) * gdiffusealbedo;
…
我們為第乙個引數傳遞乙個samplerstate物件,指示如何對紋理資料進行取樣,並為第二個引數傳遞畫素的(u,v)紋理座標。 此方法使用samplerstate物件指定的過濾方法從指定(u,v)點處的紋理貼圖返回插值顏色。 D3D12渲染技術之渲染管線
渲染管線指的是通過虛擬相機看到的內容生成2d影象的整個步驟序列,在部落格d3d12渲染技術概述中介紹過渲染管線,本篇部落格具體講解各個模組的作用,先看下圖所示 上圖中input assembler stage表示的是從儲存器讀取幾何資料 頂點和索引 並使用它來組裝幾何圖元 例如,三角形,線條 簡單地...
D3D12渲染技術之過濾
紋理貼圖的元素是來自連續影象的離散顏色樣本,它們不是帶有區域的矩形。所以問題是 如果我們的紋理座標 u,v 與其中乙個紋理畫素點不一致,會發生什麼?這可能發生以下情況。假設放大場景中的牆壁,使牆壁覆蓋整個螢幕,例如,假設顯示器解析度為1024 1024,牆壁的紋理解析度為256 256,這說明紋理放...
D3D12渲染技術之紋理案例
我們現在回顧一下將紋理新增到箱子模型上面,就跟以前的部落格中提到的那樣。下面我們詳細介紹如何實現?geometrygenerator createbox生成箱子的紋理座標,以便將整個紋理影象對映到箱子的每個面上。為簡潔起見,我們僅顯示正面,背面和頂面的頂點定義。另請注意,我們省略了頂點建構函式中法線...