原文:Direct3D纹理映射
更详细的文章:DirectX中的纹理映射相关技术 (转)
创建纹理对象
1: HRESULT CreateTexture( 2: UINT Width,//宽度 3: UINT Height,//高度 4: UINT Levels,//多级渐进纹理序列级数 5: DWORD Usage,//用途 6: D3DFORMAT Format,//像素格式 7: D3DPOOL Pool,//内存池类型 8: IDirect3DTexture9** ppTexture,//创建的纹理对象指针 9: HANDLE* pSharedHandle//保留值,恒为0 10: );
|
1: HRESULT D3DXCreateTextureFromFile( 2: LPDIRECT3DDEVICE9 pDevice,//D3D设备对象接口 3: LPCTSTR pSrcFile,//图片路径 4: LPDIRECT3DTEXTURE9 * ppTexture//返回生成的D3D纹理对象指针 5: ); |
纹理过滤方式
·Nearest-point sampling(最近点采样)
·Linear texture filtering(线性纹理过滤)
·Anisotropic texture filtering(各向异性纹理过滤)
·Texture filtering with mipmaps(多级渐进纹理过滤)
D3DTEXF_POINT | 取距离最近的像素的颜色,适用于纹理与图元的大小相近时 |
D3DTEXF_LINEAR | 对上下左右4个纹理元素进行加权平均 |
D3DTEXF_ANISOTROPIC | 对映射点周围方形8个或更多的像素进行取样,获得平均值后映射到像素点上 |
D3DSAMP_MIPFILTER | 采用不同分辨率的纹理序列 |
游戏中常见的三种方式:
·Bilinear Interpolation (双线过滤D3DTEXF_LINEAR)
这种处理方式较适用于有一定景深的静态影像,不过无法提供最佳品质。其最大问题在于,当三维物体变得非常小时,一种被称为Depth Aliasing artifacts(深度赝样锯齿),也不适用于移动中的物件。
·Trilinear Interpolation (三线过滤D3DSAMP_MIPFILTER+ D3DTEXF_LINEAR)
一个“双线过滤”需要三次混合,而“三线过滤”就得作七次混合处理,所以每个像素就需要多用21/3倍以上的计算时间。还需要两倍大的存储器时钟带宽。但是“三线过滤”可以提供最高的贴图品质,会去除材质的“闪烁”效果。对于需要动态物体或景深很大的场景应用方面而言,只有“三线过滤”才能提供可接受的材质品质。
·Anisotropic Interpolation (各向异性过滤D3DTEXF_ANISOTROPIC)
它在取样时候,会取8个甚至更多的像素来加以处理,所得到的质量最好。
它在取样时候,会取8个甚至更多的像素来加以处理,所得到的质量最好。
可以与线性纹理过滤和多级渐进纹理过滤结合使用.一般来说4X以上才有效果
纹理寻址模式
当纹理坐标在[0.0, 1.0]范围之外时的情况
1. Wrap texture address mode(重叠)
2. Mirror texture address mode(镜像)
3. Clamp texture address mode(夹取)
4. Border color texture address mode(边框颜色)
纹理阶段混合
颜色混合,纹理混合,Alpha混合,还有个凹凸映射?
纹理包装
Texture Wrapping,改变D3D光栅器使用纹理坐标对有纹理的多边形进行光栅化操作的基本方式.
U,V纹理包装的使用会影响D3D在U,V方向上对纹理坐标间最短线的选取.
上图中的U方向上的包装使AB之间的纹理坐标内插操作就穿越了0.0和1.0所在的交界线.
可以用纹理包装来做环境映射(现在通常都是用Cubemap吧?)略过