今天才注意到D3D11_FILTER的枚举的数字是由构造的规律的,头文件还提供了方便的构造宏。这里速记一下以备忘。

DX11的Sampler Filter目测由9个Bit组成。
- 前6个bit分别是 mip/mag/min, 每个占2个bit,实际上只会用一个bit(linear/point)
- 第7个bit是
ANISOTROPIC的标记位,Anisotropic存在的时候,后6个bit只能为010101,即三个linear - 8-9的2个bit用来表示
D3D11_FILTER_REDUCTION_TYPE.
两个例子:
D3D11_FILTER_MIN_MAG_MIP_LINEAR = 0x15,,拆解为0b00'0'01'01'01,即min/mag/mip都是linear,reduction type是standard。
D3D11_FILTER_MINIMUM_ANISOTROPIC = 0x155,,拆解为0b10'1'01'01'01,即min/mag/mip都是linear,anisotropic bit为1, reduction type是minimul(2)。
d3d11.h提供两个宏来构建filter
#define D3D11_ENCODE_BASIC_FILTER( min, mag, mip, reduction )
#define D3D11_ENCODE_ANISOTROPIC_FILTER( reduction )
可以快速构造出想要的filter 标记,比如想要个最朴素的linear sampler,可以
D3D11_SAMPLER_DESC samplerDesc = {};
samplerDesc.Filter = D3D11_ENCODE_BASIC_FILTER(D3D11_FILTER_TYPE_LINEAR,
D3D11_FILTER_TYPE_LINEAR,
D3D11_FILTER_TYPE_LINEAR,
D3D11_FILTER_REDUCTION_TYPE_STANDARD);
//...
reduction type
typedef enum D3D11_FILTER_REDUCTION_TYPE {
D3D11_FILTER_REDUCTION_TYPE_STANDARD = 0,
D3D11_FILTER_REDUCTION_TYPE_COMPARISON = 1,
D3D11_FILTER_REDUCTION_TYPE_MINIMUM = 2,
D3D11_FILTER_REDUCTION_TYPE_MAXIMUM = 3
} ;
Reduction Type相关的sampler我好像只在Unity用过,用来做shadowmap的PCF,可以一次性采样2x2像素,需要和hlsl里的SampleCmp/SampleCmpLevelZero配合使用。
以下包含一点自己的猜测,具体是不是这样用还需要自己写一下。
这是利用了纹理采样一次是实际上采样2x2像素。
D3D11_FILTER_REDUCTION_TYPE_STANDARDD3D11_FILTER_REDUCTION_TYPE_COMPARISON感觉和shader里的samplecmp有关,用来做硬件pcf的时候有用,和shadowmap比较D3D11_FILTER_REDUCTION_TYPE_MINIMUM/D3D11_FILTER_REDUCTION_TYPE_MAXIMUM,返回四个像素的最小最大值。
原来的linear只是返回双线性插值的结果,通过调整reduction type的话可以返回min/max值。
不确定对Nearest的采样是否有效,不知道在Point采样的时候是返回min/max还是返回最近的像素,不过我猜是返回最近的像素,这几个flag应该只适合和linear sample搭配在一起用。
Reference
参考:D3D11_FILTER (d3d11.h) - Win32 apps | Microsoft Learn 参考:D3D11_FILTER_REDUCTION_TYPE (d3d11.h) - Win32 apps | Microsoft Learn