关于使用质地

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. hdu2126(求方案数的01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看 ...

  2. VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化

    VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化 VMware ThinApp 应用程序虚拟化软件是无代理解决方案,通过将应用程序隔离并封装为EXE ...

  3. apache +php +php curl 模块设置

    2.2 linux 下面 2.2.1 web服务器安装 1目前采用的web服务器是apache2,在ubuntu 下安装 apt-getupdate apt-get installapache2 测试 ...

  4. 我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!

    本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超 ...

  5. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  6. 图解:Activity生命周期

    当用户需要对手机通过屏幕进行交互时,比如打一个电话,拍张照片,发送一个邮件,或者查看地图.开发者就需要实现一个活动(Activity).每个活动都将作为一个提供用户使用接口的窗口.它可以填满整个屏幕, ...

  7. UNIX网络编程卷1 时间获取程序server TCP 协议相关性

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 最初代码:  这是一个简单的时间获取server程序.它和时间获取程序client一道工作. ...

  8. [Unity3D]Unity4全新的动画系统Mecanim

    Unity4.X添加一个新的动画系统,以取代原有的3.X旧的动画系统,全新的动画系统Mecanim是官方推荐,它使我们能够写更少的代码实现连续动画. 效果图 Unity3.X中动画系统播放动画 使用播 ...

  9. POJ 1274 The Perfect Stall 水二分匹配

    主题链接:id=1274">点击打开链接 呵呵 #include<cstdio> #include<cstring> #include<cstdlib&g ...

  10. Trie图

    AC自动机是KMP的多串形式,当文本串失配时,AC自动机的fail指针告诉我们应该跳到哪里去继续匹配(跳到当前匹配串的最长后缀去),所以AC自动机的状态是有限的 但是AC自动机具有不确定性, 比如要求 ...