D3D12渲染技术之在着色器中采样

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/82905710

我们直奔主题,纹理对象在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)点处的纹理贴图返回插值颜色。

猜你喜欢

转载自blog.csdn.net/jxw167/article/details/82905710