D3D12渲染技術之在著色器中取樣
阿新 • • 發佈:2018-12-07
我們直奔主題,紋理物件在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)點處的紋理貼圖返回插值顏色。