关于使用质地

1 创建纹理

2 纹理寻址模式

3 纹理过滤





1 创建纹理

<1> D3DXCreateTexture功能

创建一个空的纹理。

HRESULT  D3DXCreateTexture(

  __in   LPDIRECT3DDEVICE9 pDevice,

  __in   UINT Width,

  __in   UINT Height,

  __in   UINT MipLevels,

  __in   DWORD Usage,

  __in   D3DFORMAT Format,

  __in   D3DPOOL Pool,

  __out  LPDIRECT3DTEXTURE9 *ppTexture

);

<2>  D3DXCreateTextureFromFile函数

从文件创建一个纹理。支持各种格式bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, .tga

HRESULT  D3DXCreateTextureFromFile(

  __in   LPDIRECT3DDEVICE9 pDevice,

  __in   LPCTSTR pSrcFile,

  __out  LPDIRECT3DTEXTURE9 *ppTexture

);

<3>  D3DXCreateTextureFromFileEx函数

这个是比综合了D3DXCreateTexture和D3DXCreateTextureFromFile函数功能的强大的纹理创建函数。

HRESULT  D3DXCreateTextureFromFileEx(

  __in     LPDIRECT3DDEVICE9 pDevice,

  __in     LPCTSTR pSrcFile,

  __in     UINT Width,

  __in     UINT Height,

  __in     UINT MipLevels,

  __in     DWORD Usage,

  __in     D3DFORMAT Format,

  __in     D3DPOOL Pool,

  __in     DWORD Filter,

  __in     DWORD MipFilter,

  __in     D3DCOLOR ColorKey,

  __inout  D3DXIMAGE_INFO *pSrcInfo,

  __out    PALETTEENTRY *pPalette,

  __out    LPDIRECT3DTEXTURE9 *ppTexture

);

纹理创建完成后。要启动纹理就要使用函数SetTexture。

HRESULT SetTexture(

  [in]  DWORD Sampler,

  [in]  IDirect3DBaseTexture9 *pTexture

);

參数Sampler :指定了第几个纹理层,sampler(採样器)指定了採样的状态值,比如滤波方式,寻址方式。

參数pTexture:指定了欲载入的纹理指针。





2 纹理的寻址方式

纹理的寻址方式,常见的有反复寻址模式。镜像寻址模式,夹取寻址模式,边框寻址模式。一次镜像寻址。设置寻址方式的函数为:

HRESULT SetSamplerState(

  [in]  DWORD Sampler,

  [in]  D3DSAMPLERSTATETYPE Type,

  [in]  DWORD Value

);

Sampler:採样器的编号

D3DSAMPLERSTATETYPE:採样器状态类型

Value:採样器指定状态的值

从枚举类型D3DSAMPLERSTATETYPE中能够找到关于寻址模式设置的三个枚举变量是:

D3DSAMP_ADDRESSU        = 1,

  D3DSAMP_ADDRESSV        = 2,

D3DSAMP_ADDRESSW        = 3,

相应的Value的值要从枚举变量中取值D3DTEXTUREADDRESS

typedef enum D3DTEXTUREADDRESS {

  D3DTADDRESS_WRAP          = 1,

  D3DTADDRESS_MIRROR        = 2,

  D3DTADDRESS_CLAMP         = 3,

  D3DTADDRESS_BORDER        = 4,

  D3DTADDRESS_MIRRORONCE    = 5,

  D3DTADDRESS_FORCE_DWORD   = 0x7fffffff 

} D3DTEXTUREADDRESS, *LPD3DTEXTUREADDRESS;

<1> D3DTADDRESS_WRAP

反复寻址方式

<2> D3DTADDRESS_MIRROR

镜像寻址方式



<3> D3DTADDRESS_CLAMP

夹取寻址方式

<4> D3DTADDRESS_BORDER

边框颜色寻址方式



<5> D3DTADDRESS_MIRRORONCE

这是镜像寻址和夹取寻址的组合,取纹理坐标的绝对值。从0处镜像寻址,从最大处夹取寻址。

就是以0为边界。把负的坐标和正的坐标做镜像。所以说是[-1,1]内是做镜像,这个范围之外就是夹取了。

另外假设纹理坐标中假设没有负坐标值的话。那么效果就和夹取寻址模式一模一样了。

<6> Texture Wrapping

系统绘制多边形的时候,会在顶点的纹理坐标值之间进行插值依次来决定多边形中的每个像素的纹理坐标值。在通常情况下,系统会把纹理当做一个2D平面。插值的时候是通过顶点之间的最短路线进行插值。那么在2D平面下。它将会是一个线段。

纹理包装就是指纹理在进行插值的时候,不再是一个2D平面,比如在U方向进行包装,就是把纹理围成一个圆柱面,这个时候两个顶点之间最短的距离是圆柱面上距离最短的距离而不再是平面上距离最短的距离。例如以下图所看到的:

A和B之间的最小距离就不是像平面上两点之间的线段。

当同一时候两个方向UV都採取包裹的时候,能够想象为面包圈的形式

3 纹理的过滤方式

纹理的过滤也是通过函数SetSamplerState来设置的。如今继续看看D3DSAMPLERSTATETYPE的枚举类型的中全部的类型。例如以下所看到的:

typedef enum D3DSAMPLERSTATETYPE {
  D3DSAMP_ADDRESSU        = 1,
  D3DSAMP_ADDRESSV        = 2,
  D3DSAMP_ADDRESSW        = 3,
  D3DSAMP_BORDERCOLOR     = 4, //设置纹理边界颜色
  D3DSAMP_MAGFILTER       = 5, //放大滤波
  D3DSAMP_MINFILTER       = 6, //缩小滤波
  D3DSAMP_MIPFILTER       = 7, //MIP滤波
  D3DSAMP_MIPMAPLODBIAS   = 8, //多级纹理映射的偏移值
  D3DSAMP_MAXMIPLEVEL     = 9, //最大纹理过滤级数
  D3DSAMP_MAXANISOTROPY   = 10,//设置各项异性最大值,越大越好
  D3DSAMP_SRGBTEXTURE     = 11,//
  D3DSAMP_ELEMENTINDEX    = 12,//
  D3DSAMP_DMAPOFFSET      = 13,//
  D3DSAMP_FORCE_DWORD     = 0x7fffffff 
} D3DSAMPLERSTATETYPE, *LPD3DSAMPLERSTATETYPE;

详细滤波的值从枚举类型D3DTEXTUREFILTERTYPE

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;

<1> D3DTEXF_POINT

近期点採样

Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_POINT)

Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_POINT);

<2> D3DTEXF_LINEAR

线性纹理过滤

Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR)

Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);

<3> D3DTEXF_ANISOTROPIC

各项异性纹理过滤。使用之前必须设置D3DSAMP_MAXANISOTROPIC,该值决定各项异性过滤的水平,值越大效果越好

Device->SetSamplerState(0,D3DSAMP_MAXANISOTROPIC,4);

Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_ANISOTROPIC)

Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_ANISOTROPIC);

D3DTEXF_NONE

当使用D3DSAMP_MIPFILTER的时候,禁止多级渐进纹理过滤

<4>多级纹理渐进

这个不能必须配合其它纹理过滤方式使用,利用SetSamplerState函数,第二个參数是D3DSAMP_MIPFILTER,第三个參数选取

  D3DTEXF_NONE             
  D3DTEXF_POINT            

  D3DTEXF_LINEAR

当中D3DTEXF_NONE表示禁用多级纹理过滤。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Direct3D 使用质地的更多相关文章

  1. DirectX游戏编程(一):创建一个Direct3D程序

    一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...

  2. Direct3D设备管理器(Direct3D device manager)

    这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.并准备记录一下用ffmpeg实现dxva2,将在第三篇写到.这是第一篇,英文原址:https://msdn.microsof ...

  3. [ZZ] A Proposal For Compiling Direct3D HLSL With LLVM (Written by Michael Larabel )

    http://www.phoronix.com/scan.php?page=news_item&px=OTI2NA Note:  Something very instersting to w ...

  4. 【译】Import Changes from Direct3D 11 to Direct3D 12

    译者:林公子 出处:木木的二进制人生 转载请注明作者和出处,谢谢! 这是微软公布的Direct3D 12文档的其中一篇,此翻译留作学习记录备忘,水平有限,错漏难免,还望海涵. 原文链接是https:/ ...

  5. Direct3D 10学习笔记(四)——Windows编程

    本篇将简单整理基本的Windows应用程序的实现,并作为创建Direct3D 10应用程序的铺垫.具体内容参照< Introduction to 3D Game Programming with ...

  6. Direct3D 10学习笔记(三)——文本输出

    本篇将简单整理Direct3D 10的文本输出的实现,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅 ...

  7. Direct3D 10学习笔记(二)——计时器

    本篇将简单整理Direct3D 10的计时器实现,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译 ...

  8. Direct3D 10学习笔记(一)——初始化

    本篇将简单整理Direct3D 10的初始化,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译的电 ...

  9. [转]Direct3D 11 Tessellation Tutorial

    The new hardware tessellation feature available on Direct3D 11 video cards has great potential, but ...

随机推荐

  1. Thinkphp常用标签

    告:在使用下列所说的任何标签库都需要 HTML第一行加入 <tarlib name=”cx,html” /> 如果想单独引入cx标签库就直接写成<tarlib name=”cx” / ...

  2. XSS漏洞的分类

    XSS漏洞依照攻击利用手法的不同,有下面三种类型: 类型A,本地利用漏洞,这样的漏洞存在于页面中client脚本自身.其攻击步骤例如以下所看到的: Alice给Bob发送一个恶意构造了Web的URL. ...

  3. My Solution: Word Ladder

    public class Solution { public int ladderLength(String start, String end, Set<String> dict) { ...

  4. Multitasking Apps may only use background services for their intended purposes

    2.16 Details Your app declares support for audio in the UIBackgroundModes key in your Info.plist, bu ...

  5. 理解cookie的path和domain属性(转)

    今天在做验证码时发现一个问题:A.B窗口都打开同一个页面,A先生成一个验证码,B再生成验证码,这时A所生成的验证码被B覆盖掉了.原因是使用了同名的cookie来存储验证码.一时找不到解决方法就参考了W ...

  6. DLNA它 Error, can&#39;t findlibavformat ! 解

    DLNA库版本号为libdlna-0.2.4 运行./configure出错: ------------------------------ Error, can't findlibavformat ...

  7. Android源代码同步脚本(增加设置线程参数)

    #!/bin/sh #Filename: repo_sync.sh count= ret= ] do #输入参数1,用作同步的线程数 #如果什么参数都不输入,默认线程为4 #usage: ./repo ...

  8. lock订单号

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  9. 重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom

    原文:重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom [源码下载] 重新想象 Windows 8 Store Apps (13) - 控件之 Sem ...

  10. 趣味Java算法题(附答案)

    [程序1]    题目:古典问题:有一对兔子,从出生后第3个月起每一个月都生一对兔子,小兔子长到第三个月后每一个月又生一对兔子,假如兔子都不死,问每一个月的兔子总数为多少?    //这是一个菲波拉契 ...