转载Direct3D纹理映射

Posted 米罗西

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载Direct3D纹理映射相关的知识,希望对你有一定的参考价值。

原文:Direct3D纹理映射

 

创建纹理对象
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个甚至更多的像素来加以处理,所得到的质量最好。
可以与线性纹理过滤和多级渐进纹理过滤结合使用.一般来说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吧?)略过

以上是关于转载Direct3D纹理映射的主要内容,如果未能解决你的问题,请参考以下文章

转载D3D中的Texture应用示例

OpenGL纹理映射总结

纹理基础

纹理在openGL中使用2D纹理映射3D对象

opengl纹理映射总结

OpenGL二维纹理映射(2D textures)