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

2021-08-28 14:26:44 字數 1493 閱讀 9754

我們直奔主題,紋理物件在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生成箱子的紋理座標,以便將整個紋理影象對映到箱子的每個面上。為簡潔起見,我們僅顯示正面,背面和頂面的頂點定義。另請注意,我們省略了頂點建構函式中法線...