版权声明:本文为博主原创文章,未经博主允许不得转载。 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)点处的纹理贴图返回插值颜色。