D3D11_Filter 枚举组装 | Blurred code

D3D11_Filter 枚举组装

2023/07/24

LastMod:2023/07/24

Categories: CG

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

D3D11_Filter_bit组成-2023-07-24-01-07-58

DX11的Sampler Filter目测由9个Bit组成。

两个例子: D3D11_FILTER_MIN_MAG_MIP_LINEAR = 0x15,,拆解为0b00'0'01'01'01,即min/mag/mip都是linearreduction typestandard

D3D11_FILTER_MINIMUM_ANISOTROPIC = 0x155,,拆解为0b10'1'01'01'01,即min/mag/mip都是linearanisotropic bit为1, reduction typeminimul(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像素。

原来的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