當Direct3D渲染一個圖元時,必須將它通過坐標變換映射到二維屏幕上。如果圖元有紋理,Direct3D就需要用紋理來產生圖元的二維渲染圖像上每個像素的顏色。對于圖元在二維屏幕上圖像的每個像素來說,都必須從紋理中獲得一個顏色,從紋理中為每個像素獲取顏色的過程稱為紋理過濾(texture
filtering)。
大多數情況下,屏幕顯示的圖形大小與紋理貼圖大小不相同,換句話說,這個紋理將被映射到一個比它大或小的圖元的圖像上,這樣紋理常常會被放大或縮小。對紋理的放大會造成許多像素被映射到同一個紋理元素,圖形渲染結果會有色塊的感覺。縮小一個紋理意味著一個像素被映射到許多紋理元素,圖形看上去會閃爍失真或有鋸齒。為了解決這些問題,可以將相關紋理元素的顏色融合到一個像素上,如何將多個紋理元素的顏色融合到一個像素上取決于紋理過濾方式。
Direct3D支持4種紋理過濾方式,分別是:最近點采樣(nearest-point sampling)、線性紋理過濾(linear
texture filtering)、各向異性紋理過濾(anisotropic texture
filtering)和多級漸進紋理過濾(texture filtering with mipmaps)。不同的紋理過濾方式產生的圖像效果差別可能很大。
4種紋理過濾方法各有優缺點。例如,線性過濾生成的圖像較粗糙,但計算量小。多級漸進紋理過濾的效果通常最好,特別是和各項異性過濾聯合使用時效果更好,但是它需要Direct3D提供的內存空間最多,計算量也最大。
紋理采樣屬性設置函數IDirect3DDevice9::SetSamplerState()可以用來設置紋理過濾方式。該函數的聲明如下:
Sets the sampler state value.
HRESULT SetSamplerState(
DWORD Sampler,
D3DSAMPLERSTATETYPE Type,
DWORD Value
);
Parameters
- Sampler
- [in] The sampler stage index.
- Type
- [in] This parameter can be any member of the
D3DSAMPLERSTATETYPE enumerated type.
- Value
- [in] State value to set. The meaning of this value
is determined by the Type parameter.
Return Values
If the method succeeds, the return value is D3D_OK. If
the method fails, the return value can be D3DERR_INVALIDCALL.
參數Type屬于D3DSAMPLERSTATETYPE類型,用來指定對哪種紋理采樣屬性賦值。
D3DSAMPLERSTATETYPE
Sampler states define texture sampling operations such
as texture addressing and texture filtering. Some sampler states set-up vertex
processing, and some set-up pixel processing. Sampler states can be saved and
restored using stateblocks (see State Blocks Save and Restore State (Direct3D
9)).
typedef enum D3DSAMPLERSTATETYPE
{
D3DSAMP_ADDRESSU = 1,
D3DSAMP_ADDRESSV = 2,
D3DSAMP_ADDRESSW = 3,
D3DSAMP_BORDERCOLOR = 4,
D3DSAMP_MAGFILTER = 5,
D3DSAMP_MINFILTER = 6,
D3DSAMP_MIPFILTER = 7,
D3DSAMP_MIPMAPLODBIAS = 8,
D3DSAMP_MAXMIPLEVEL = 9,
D3DSAMP_MAXANISOTROPY = 10,
D3DSAMP_SRGBTEXTURE = 11,
D3DSAMP_ELEMENTINDEX = 12,
D3DSAMP_DMAPOFFSET = 13,
D3DSAMP_FORCE_DWORD = 0x7fffffff,
} D3DSAMPLERSTATETYPE, *LPD3DSAMPLERSTATETYPE;
Constants
- D3DSAMP_ADDRESSU
- Texture-address mode for the u coordinate. The
default is D3DTADDRESS_WRAP. For more information, see D3DTEXTUREADDRESS.
- D3DSAMP_ADDRESSV
- Texture-address mode for the v coordinate. The
default is D3DTADDRESS_WRAP. For more information, see D3DTEXTUREADDRESS.
- D3DSAMP_ADDRESSW
- Texture-address mode for the w coordinate. The
default is D3DTADDRESS_WRAP. For more information, see D3DTEXTUREADDRESS.
- D3DSAMP_BORDERCOLOR
- Border color or type D3DCOLOR. The default color
is 0x00000000.
- D3DSAMP_MAGFILTER
- Magnification filter of type D3DTEXTUREFILTERTYPE.
The default value is D3DTEXF_POINT.
- D3DSAMP_MINFILTER
- Minification filter of type
D3DTEXTUREFILTERTYPE. The default value is D3DTEXF_POINT.
- D3DSAMP_MIPFILTER
- Mipmap filter to use during minification. See
D3DTEXTUREFILTERTYPE. The default value is D3DTEXF_NONE.
- D3DSAMP_MIPMAPLODBIAS
- Mipmap level-of-detail bias. The default value is
zero.
- D3DSAMP_MAXMIPLEVEL
- level-of-detail index of largest map to use.
Values range from 0 to (n - 1) where 0 is the largest. The default value is
zero.
- D3DSAMP_MAXANISOTROPY
- DWORD maximum anisotropy. The default value is 1.
- D3DSAMP_SRGBTEXTURE
- Gamma correction value. The default value is 0,
which means gamma is 1.0 and no correction is required. Otherwise, this
value means that the sampler should assume gamma of 2.2 on the content and
convert it to linear (gamma 1.0) before presenting it to the pixel shader.
- D3DSAMP_ELEMENTINDEX
- When a multielement texture is assigned to the
sampler, this indicates which element index to use. The default value is 0.
- D3DSAMP_DMAPOFFSET
- Vertex offset in the presampled displacement map.
This is a constant used by the tessellator, its default value is 0.
- D3DSAMP_FORCE_DWORD
- Forces this enumeration to compile to 32 bits in
size. Without this value, some compilers would allow this enumeration to
compile to a size other than 32 bits. This value is not used.
其中,D3DSAMP_MAGFILTER、D3DSAMP_MINFILTER、D3DSAMP_MIPFILTER、D3DSAMP_MIPMAPLODBIAS、D3DSAMP_MAXMIPLEVEL和D3DSAMP_MAXANISOTROPY用來控制紋理過濾方式。
D3DTEXTUREFILTERTYPE
Defines texture filtering modes for a texture stage.
typedef enum D3DTEXTUREFILTERTYPE
{
D3DTEXF_NONE = 0,
D3DTEXF_POINT = 1,
D3DTEXF_LINEAR = 2,
D3DTEXF_ANISOTROPIC = 3,
D3DTEXF_PYRAMIDALQUAD = 6,
D3DTEXF_GAUSSIANQUAD = 7,
D3DTEXF_CONVOLUTIONMONO = 8,
D3DTEXF_FORCE_DWORD = 0x7fffffff,
} D3DTEXTUREFILTERTYPE, *LPD3DTEXTUREFILTERTYPE;
Constants
- D3DTEXF_NONE
- Mipmapping disabled. The rasterizer should use the
magnification filter instead.
- D3DTEXF_POINT
- Point filtering used as a texture magnification or
minification filter. The texel with coordinates nearest to the desired pixel
value is used. The texture filter to be used between mipmap levels is
nearest-point mipmap filtering. The rasterizer uses the color from the texel
of the nearest mipmap texture.
- D3DTEXF_LINEAR
- Bilinear interpolation filtering used as a texture
magnification or minification filter. A weighted average of a 2 x 2 area of
texels surrounding the desired pixel is used. The texture filter to use
between mipmap levels is trilinear mipmap interpolation. The rasterizer
linearly interpolates pixel color, using the texels of the two nearest
mipmap textures.
- D3DTEXF_ANISOTROPIC
- Anisotropic texture filtering used as a texture
magnification or minification filter. Compensates for distortion caused by
the difference in angle between the texture polygon and the plane of the
screen.
- D3DTEXF_PYRAMIDALQUAD
- A 4-sample tent filter used as a texture
magnification or minification filter.
- D3DTEXF_GAUSSIANQUAD
- A 4-sample Gaussian filter used as a texture
magnification or minification filter.
- D3DTEXF_CONVOLUTIONMONO
- Convolution filter for monochrome textures. See
D3DFMT_A1.
Differences between Direct3D 9 and
Direct3D 9Ex:
This flag is available
in Direct3D 9Ex only.
|
- D3DTEXF_FORCE_DWORD
- Forces this enumeration to compile to 32 bits in
size. Without this value, some compilers would allow this enumeration to
compile to a size other than 32 bits. This value is not used.
Remarks
To check if a format supports texture filter types
other than D3DTEXF_POINT (which is always supported), call
IDirect3D9::CheckDeviceFormat with D3DUSAGE_QUERY_FILTER.
Set a texture stage's magnification filter by calling
IDirect3DDevice9::SetSamplerState with the D3DSAMP_MAGFILTER value as the second
parameter and one member of this enumeration as the third parameter.
Set a texture stage's minification filter by calling
IDirect3DDevice9::SetSamplerState with the D3DSAMP_MINFILTER value as the
second parameter and one member of this enumeration as the third parameter.
Set the texture filter to use between-mipmap levels by
calling IDirect3DDevice9::SetSamplerState with the D3DSAMP_MIPFILTER
value as the second parameter and one member of this enumeration as the third
parameter.
Not all valid filtering modes for a device will apply
to volume maps. In general, D3DTEXF_POINT and D3DTEXF_LINEAR magnification
filters will be supported for volume maps. If D3DPTEXTURECAPS_MIPVOLUMEMAP is
set, then the D3DTEXF_POINT mipmap filter and D3DTEXF_POINT and D3DTEXF_LINEAR
minification filters will be supported for volume maps. The device may or may
not support the D3DTEXF_LINEAR mipmap filter for volume maps. Devices that
support anisotropic filtering for 2D maps do not necessarily support anisotropic
filtering for volume maps. However, applications that enable anisotropic
filtering will receive the best available filtering (probably linear) if
anisotropic filtering is not supported.
Unsigned Formats
Data in an unsigned format must be positive. Unsigned
formats use combinations of (R)ed, (G)reen, (B)lue, (A)lpha, (L)uminance, and
(P)alette data. Palette data is also referred to as color indexed data because
the data is used to index a color palette.
Unsigned
format flags |
Value |
Format |
D3DFMT_R8G8B8 |
20 |
24-bit
RGB pixel format with 8 bits per channel. |
D3DFMT_A8R8G8B8 |
21 |
32-bit
ARGB pixel format with alpha, using 8 bits per channel. |
D3DFMT_X8R8G8B8 |
22 |
32-bit
RGB pixel format, where 8 bits are reserved for each color. |
D3DFMT_R5G6B5 |
23 |
16-bit
RGB pixel format with 5 bits for red, 6 bits for green, and 5 bits for
blue. |
D3DFMT_X1R5G5B5 |
24 |
16-bit
pixel format where 5 bits are reserved for each color. |
D3DFMT_A1R5G5B5 |
25 |
16-bit
pixel format where 5 bits are reserved for each color and 1 bit is
reserved for alpha. |
D3DFMT_A4R4G4B4 |
26 |
16-bit
ARGB pixel format with 4 bits for each channel. |
D3DFMT_R3G3B2 |
27 |
8-bit
RGB texture format using 3 bits for red, 3 bits for green, and 2 bits
for blue. |
D3DFMT_A8 |
28 |
8-bit
alpha only. |
D3DFMT_A8R3G3B2 |
29 |
16-bit
ARGB texture format using 8 bits for alpha, 3 bits each for red and
green, and 2 bits for blue. |
D3DFMT_X4R4G4B4 |
30 |
16-bit
RGB pixel format using 4 bits for each color. |
D3DFMT_A2B10G10R10 |
31 |
32-bit
pixel format using 10 bits for each color and 2 bits for alpha. |
D3DFMT_A8B8G8R8 |
32 |
32-bit
ARGB pixel format with alpha, using 8 bits per channel. |
D3DFMT_X8B8G8R8 |
33 |
32-bit
RGB pixel format, where 8 bits are reserved for each color. |
D3DFMT_G16R16 |
34 |
32-bit
pixel format using 16 bits each for green and red. |
D3DFMT_A2R10G10B10 |
35 |
32-bit
pixel format using 10 bits each for red, green, and blue, and 2 bits for
alpha. |
D3DFMT_A16B16G16R16 |
36 |
64-bit
pixel format using 16 bits for each component. |
D3DFMT_A8P8 |
40 |
8-bit
color indexed with 8 bits of alpha. |
D3DFMT_P8 |
41 |
8-bit
color indexed. |
D3DFMT_L8 |
50 |
8-bit
luminance only. |
D3DFMT_L16 |
81 |
16-bit
luminance only. |
D3DFMT_A8L8 |
51 |
16-bit
using 8 bits each for alpha and luminance. |
D3DFMT_A4L4 |
52 |
8-bit
using 4 bits each for alpha and luminance. |
D3DFMT_A1 |
118 |
1-bit
monochrome.
Differences between Direct3D 9 and Direct3D 9Ex:
This flag is available in Direct3D 9Ex only.
|
|
D3DFMT_BINARYBUFFER |
199 |
Binary
format indicating that the data has no inherent type.
Differences between Direct3D 9 and Direct3D 9Ex:
This flag is available in Direct3D 9Ex only.
|
|