关于使用质地

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. TCP closing a connection

    client closes socket: clientSocket.close(); step1 :client sends TCP FIN control segment to server st ...

  2. swfobject.js的简单配置

    因为工作需要在网页中迁入flash,开发过程中,发现直接使用embed自己开发的话需要考虑各种兼容性,也比较麻烦, 网上也找了几个相关的插件,比较使用之下,发现swfobject.js这一款还是蛮不错 ...

  3. 【转】.net IL 指令解释速查

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  4. visual studio 2013常用快捷键 VS2013快捷键大全

    visual studio 2013常用快捷键 VS2013快捷键大全   Visual Studio 2013 是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具 ...

  5. Hibernate 配置详解(11)

    hibernate.session_factory_name_is_jndi 配置hibernate.cfg.xml中SessionFactory的name属性是否作为JNDI名称绑定.默认是true ...

  6. Java中的反射——(1)什么是反射

    Java程序中的各个Java类属于同一类事物,描写叙述这类事物的Java类名就是Class. public class ReflectTest { public static void main(St ...

  7. ORACLE函数之日期时间运算函数

    1            ADD_MONTHS 格式:ADD_MONTHS(D,N) 说明:返回日期时间D加N月后相应的日期时间.N为正时则表示D之后:N为负时则表示为D之前.N为小数则会自己主动先删 ...

  8. CSS3影子 box-shadow使用和技巧总结

    text-shadow阴影效果添加到文本,box-shadow块元素被添加到周围的阴影. 随着html5和CSS3声望.越来越普遍的使用特效. 基本语法这是{box-shadow:[inset] x- ...

  9. 设计模式初探3——装饰者模式(Decorator Pattern)

    装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 适用范围: 1. 须要扩展一个类的功能.或给一个类加入附加职责. 2. 须要动态的给一个对象加入功能,这些功 ...

  10. 关于bind函数和connect函数的测试结论

    1. 一般客户端不用绑定,系统给你自动分配(有些ip不是固定的,bind也不是一个好方法):而服务器需要绑定,因为需要给客户端一个众所周知的固定的地址: 2. 关于bind错误,可以用WSAGetLa ...