1. 程式人生 > >D3D12渲染技術之在著色器中取樣

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

我們直奔主題,紋理物件在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 PosH  : SV_POSITION;
  float3 PosW  : POSITION;
  float3 NormalW : NORMAL;
  float2 TexC  : TEXCOORD;
};
 
float4 PS(VertexOut pin) : SV_Target
{
float4 diffuseAlbedo = gDiffuseMap.Sample(gsamAnisotropicWrap, pin.TexC) * gDiffuseAlbedo;
  …

我們為第一個引數傳遞一個SamplerState物件,指示如何對紋理資料進行取樣,併為第二個引數傳遞畫素的(u,v)紋理座標。 此方法使用SamplerState物件指定的過濾方法從指定(u,v)點處的紋理貼圖返回插值顏色。