来源:http://www.cnblogs.com/fence/archive/2010/03/12/1683918.html
纹理在D3D中是一个非常重要的概念,它的出现改变了以前3D物体表面不真实的状况,为程序员提供了将2维图像应用到3维物体上去的功能。请做 好心理准备,因为新的概念将像暴风骤雨般的袭来,而在没有弄懂基本概念之前是不可能进行下一步的学习的。下面是一些术语的大致概念:
包装纹理寻址模式:D3D默认寻址模式。效果如下:
镜像纹理寻址模式:每两个相邻的单位纹理都是镜像效果的。如下:
夹持纹理寻址模式:只映射在区间[0, 1]中的纹理,然后在其他空间中涂上和纹理边界相反的颜色,如图:
边框颜色纹理寻址模式:在区间[0, 1]之外涂上指定颜色,例如:
一次镜像纹理寻址模式:纹理在[-1.0, 1.0]范围内作镜像,在该范围外作夹持。
mipmap:由一系列纹理组成,其中每张纹理的高宽都是前一级高宽的一半。D3D在渲染时会自动挑选出一个图素与像素的比值最接近于1的mip层级。
最近点采样:将纹理坐标对齐到最接近的整数,再将那个位于整数坐标上的纹理像素作为最终的颜色。缺点:容易在图像边界上造成错误,优点:快。
线性纹理过滤:(即双线纹理过滤),计算相对于采样点最近的4各图素(上下左右4个点)的平均值。缺点:有各项异性失真可能。
三线过滤:对于每个像素,三线过滤会先选择两张最接近的mipmap,将它们双线过滤为两张理想大小的mipmap,然后根据理想的mip级组合这两张过滤后的mipmap中的对应像素。缺点:有各项异性失真可能。
各项异性过滤:根据屏幕像素的伸张度来测量各项异性,再将屏幕像素反向映射到纹理空间中。效果:在非水平的渲染时要比三线过滤更加锐化。
FinalColor = SourceColor * SourceBlendFactor + DestColor * DestBlendFactor
如果使SourceBlendFactor + DestBlendFactor = 1,那么就可以实现透明效果。
LPDIRECT3DTEXTURE9 g_pTexture = NULL; // Texture
structCUSTOMVERTEX
{
FLOATx, y, z, rhw; // The transformed position for the vertex
// DWORD color; // The vertex color, no use here
FLOATtu, tv; // The texture coordinates
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1)
OnCreateDevice:添加纹理创建代码,在顶点缓冲中添加纹理坐标信息,横向复制两遍纹理
V_RETURN( D3DXCreateTextureFromFile(pd3dDevice, L " DaNing_Hudie.jpg " , & g_pTexture) );
CUSTOMVERTEXvertices[] =
{
{ 0.0f , 0.0f , 0.5f , 1.0f , 0.0f , 0.0f ,}, // x, y, z, rhw, color
{ ( float )pBackBufferSurfaceDesc -> Width, 0.0f , 0.5f , 1.0f , 2.0f , 0.0f ,},
{ ( float )pBackBufferSurfaceDesc -> Width, ( float )pBackBufferSurfaceDesc -> Height, 0.5f , 1.0f , 2.0f , 1.0f ,},
{ 0.0f , ( float )pBackBufferSurfaceDesc -> Height, 0.5f , 1.0f , 0.0f , 1.0f , },
};
pd3dDevice -> SetTexture( 0 , g_pTexture );
OnDestroyDevice:添加释放代码
SAFE_RELEASE( g_pTexture);
CUSTOMVERTEX vertices[] =
{
{ 0.0f , 0.0f , 0.5f , 1.0f , 0.0f , 0.0f ,}, // x, y, z, rhw, color
{ ( float )pBackBufferSurfaceDesc -> Width, 0.0f , 0.5f , 1.0f , 4.0f , 0.0f ,},
{ ( float )pBackBufferSurfaceDesc -> Width, ( float )pBackBufferSurfaceDesc -> Height, 0.5f , 1.0f , 4.0f , 2.0f ,},
{ 0.0f , ( float )pBackBufferSurfaceDesc -> Height, 0.5f , 1.0f , 0.0f , 2.0f , },
};
pd3dDevice -> SetTexture( 0 , g_pTexture );
pd3dDevice -> SetSamplerState( 0 , D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR );
pd3dDevice -> SetSamplerState( 0 , D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR );
pd3dDevice -> SetSamplerState( 0 , D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER );
pd3dDevice -> SetSamplerState( 0 , D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER );
pd3dDevice -> SetSamplerState( 0 , D3DSAMP_BORDERCOLOR, 0xff88aa66 );
pd3dDevice -> SetRenderState( D3DRS_WRAP0, D3DWRAP_V );