第6章 纹理映射

版权声明:转载请注明出处 https://blog.csdn.net/weixin_39918693/article/details/88713979

借助纹理映射(texture mapping)技术,可将图像数据映射到三角形图元中,这种功能可以显著地增加所绘制场景的细节和真实感

纹理是类似于表面的一个像素矩阵与表面不同的是它可被映射到三角形图元中

  • 1、实现纹理的映射
  • 2、创建纹理
  • 3、对纹理进行过滤,以创建一幅较光滑的图像

1、纹理坐标

D3D所使用的纹理坐标系由沿水平方向的u轴和沿垂直方向的v轴构成。用坐标对标识的纹理元素称为纹理元(texel)

为了能够处理不同尺寸的纹理,D3D将纹理坐标做了规范化处理,使之限定在0~1之间

对于每个3D三角形图元,我们都可以在纹理中定义一个相应的三角形区域,然后将该三角形区域内的纹理映射到该3D三角形图元中,实际上纹理映射是发生在光栅化时,那时三角形图元已经变成了2D了

typedef struct Vertex{
	float _x, _y, _z;
	float _nx, _ny, _nz;
	float _u, _v;

	static const DWORD FVF;
}Vertex;
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
顶点结构中包含了一对纹理坐标

3D三角形图元的纹理三角形指定的很早,但直到光栅化时,即该3D三角形已被变换至屏幕坐标系时,纹理映射才会进行


2、创建并启用纹理

纹理数据通常从磁盘中的图像文件读入,然后加载到纹理对象中
HRESULT D3DXCreateTextureFromFile(
	LPDIRECT3DDEVICE9 pDevice,
	LPCTSTR pSrcFile,
	LPDIRECT3DTEXTURE9 *ppTexture
);

上述函数支持的纹理格式:BMP、DDS、DIB、JPG、PNG、TGA

通过HRESULT IDirect3DDevice9::SetTexture来设置当前纹理。与材质对比记忆

在固定功能的渲染管线中,最多可设置8层纹理,可以对这些纹理进行组合以创建一幅更细致的图像。这称为多重纹理(multitexturing)

可以通过SetTexture函数禁用某一纹理层


3、纹理过滤器

也称为纹理采样

经过投影变换和视口变换后,3D三角形图元被变换为屏幕上的2D三角形图元。通常,纹理三角形与屏幕三角形的大小并不一致,这就会涉及到放缩操作,这时肯定会有畸变发生。为了从某种程度上克服这类畸变,D3D采用了纹理过滤(texture filtering)技术

D3D提供了3种类型的纹理过滤方式,每种过滤方式都提供一种质量水平(level of quality)。质量越高,运算开销越大,处理速度越慢

3种不同的纹理过滤方式:

  • 1、最近点采样(nearest point sampling)
  • 2、线性纹理过滤(linear filtering)推荐使用这种
  • 3、各向异性纹理过滤(anisotropic filtering)

在使用各向异性纹理过滤时,我们必须对D3DSAMP_MAXANISOTROPIC水平值进行设定,该值决定了各向异性过滤的质量水平。其他两种好像并没有要求指定质量水平值?????

以上设置都是通过d3ddev->SetSamplerState函数来完成的


4、多级渐进纹理

多级渐进纹理链多级渐进纹理过滤器

如果硬件支持多级渐进纹理,那么其使用过程是自动的,至多只是需要设置一下多级渐进纹理过滤器


5、寻址模式

用来处理纹理坐标值超出0~1区间时如何进行纹理映射

  • 1、重复(wrap)
  • 2、边界颜色(border color)
  • 3、箝位(clamp)
  • 4、镜像(mirror)

猜你喜欢

转载自blog.csdn.net/weixin_39918693/article/details/88713979