HLSL纹理采样与采样器使用笔记
在HLSL中,纹理采样是通过采样器(SamplerState)来获取纹理上特定坐标点的颜色信息。以下是如何进行纹理采样以及如何使用采样器的详细说明。
纹理采样
要在HLSL中采样纹理,你需要一个纹理(Texture2D或其他类型)和一个采样器(SamplerState)。采样器定义了如何对纹理进行采样,包括过滤方式、寻址模式等。
示例代码
Texture2D _MainTex; // 声明一个2D纹理
SamplerState _MainTex_sampler; // 声明一个采样器
float4 SampleTexture(float2 uv) : SV_Target
{
return _MainTex.Sample(_MainTex_sampler, uv);
}
采样器的参数
参数名 | 作用 | 可能的值 |
Filter | 纹理过滤模式 | MIN_MAG_MIP_POINT, MIN_MAG_POINT_MIP_LINEAR, MIN_POINT_MAG_LINEAR_MIP_POINT, MIN_POINT_MAG_MIP_LINEAR, MIN_LINEAR_MAG_MIP_POINT, MIN_LINEAR_MAG_POINT_MIP_LINEAR, MIN_MAG_LINEAR_MIP_POINT, MIN_MAG_MIP_LINEAR, ANISOTROPIC |
AddressU | 纹理坐标U方向的寻址模式 | Wrap, Mirror, Clamp, Border |
AddressV | 纹理坐标V方向的寻址模式 | Wrap, Mirror, Clamp, Border |
AddressW | 纹理坐标W方向的寻址模式(仅适用于3D纹理) | Wrap, Mirror, Clamp, Border |
MipLODBias | Mip级别的偏移量 | 任意浮点数值 |
MaxAnisotropy | 各向异性过滤的最大值 | 1, 2, 4, 8, 16 |
ComparisonFunc | 比较函数(用于比较采样时) | Never, Less, Equal, LessEqual, Greater, NotEqual, GreaterEqual, Always |
BorderColor | 当寻址模式为Border时使用的边界颜色 | float4颜色值 |
MinLOD | 可访问的最小Mip级别 | 任意浮点数值 |
MaxLOD | 可访问的最大Mip级别 | 任意浮点数值 |
采样器设置示例
SamplerState _MainTex_sampler {
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Clamp;
MipLODBias = 0.0;
MaxAnisotropy = 16;
ComparisonFunc = LessEqual;
BorderColor = float4(1, 0, 0, 1);
MinLOD = 0;
MaxLOD = float.MaxValue;
};
在这个示例中,我们设置了一个采样器,其中Filter
为MIN_MAG_MIP_LINEAR
,表示在所有缩放级别上使用线性插值。AddressU
和AddressV
指定了U和V方向的寻址模式。MipLODBias
、MaxAnisotropy
、ComparisonFunc
、BorderColor
、MinLOD
和MaxLOD
也进行了相应的设置。
默认初始化
在HLSL中,如果你直接初始化一个采样器而不显式设置它的状态,它将使用图形API的默认状态。对于DirectX,这些默认状态通常是: - Filter: MIN_MAG_MIP_LINEAR
,这意味着对于缩小(Minification)、放大(Magnification)和多级渐远纹理过滤(Mipmapping),采样器将使用线性插值。 - AddressU: CLAMP
,纹理坐标U超出0,1范围时,会使用纹理边缘的颜色。 - AddressV: CLAMP
,纹理坐标V超出0,1范围时,同样会使用纹理边缘的颜色。 - AddressW: CLAMP
(仅适用于3D纹理),纹理坐标W超出0,1范围时,会使用纹理边缘的颜色。 - MipLODBias: 0.0
,没有对mip级别的选择应用偏移。 - MaxAnisotropy: 1
,表示不使用各向异性过滤,或者说使用最低的各向异性等级。 - ComparisonFunc: NEVER
,表示采样操作不会进行比较。 - BorderColor: 取决于平台和图形API,但通常是黑色或透明色。 - MinLOD: 0
,表示可以访问最低的mip级别。 - MaxLOD: 取决于图形API,但通常是最大的浮点值,表示可以访问最高的mip级别。