Direct3D 纹理使用

关于纹理使用

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 纹理使用,布布扣,bubuko.com

时间: 2024-11-03 01:16:19

Direct3D 纹理使用的相关文章

Direct3D中 SetTextureStageState 函数

先说明几个概念: 1, Multipass(多通道)     将一个任务划分成几个阶段,由多个pass处理不同阶段,后续pass总是处理前一个pass的结果.例如复杂的光照方程可以分成几个pass来计算.     用不同的纹理通过多个pass来多次渲染一个图元,这样可以实现许多很酷的特效.例如LightMap,它就是用不同的纹理来表示复杂的光.影效果.         2, Multitexture(多纹理)     很显然,pass越多,效率越低.为了降低pass的数量,有些硬件加速卡支持在一

纹理(讲得比较详细的文章)

纹理是增强计算机生成的三维图像的真实感的有力工具.Microsoft® Direct3D®支持广泛的纹理特性,并使开发人员可以很方便地使用高级纹理技术. 本节讲述如何使用纹理. 纹理的基本概念 纹理坐标 纹理过滤 纹理资源 纹理环绕 纹理混合 表面 以下主题将更详细地介绍另外的纹理功能. Mipmap的自动生成 自动纹理管理 压缩纹理资源 使用纹理时需要考虑的硬件问题 立体纹理资源 要提高性能,可以考虑使用动态纹理.动态纹理在每一帧都可以被锁定,写入及解锁.更多信息请参阅使用动态纹理. 纹理的基

纹理基础

纹理坐标 图一:direct3d纹理坐标,起始点右上角 图二:其他API定义的纹理坐标,起始点左下角 Unity的默认网格有适合纹理映射的UV坐标,可以使用TEXCOORD(X)访问:最后一位数字代表插值寄存器,最多8位(0-7) float2 UV : TEXCOORD0; float4 normal : TEXCOORD1; 采样函数:tex2D(_MainTex, i.uv); 21 struct a{ hahaha hda; } safasf asdfsa asf af adsf ads

最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)

本文记录OpenGL播放视频的技术.上一篇文章中,介绍了一种简单的使用OpenGL显示视频的方式.但是那还不是OpenGL显示视频技术的精髓.和Direct3D一样,OpenGL更好的显示视频的方式也是通过纹理(Texture).本文介绍OpenGL通过纹理的方式显示视频的技术. OpenGL中坐标和Direct3D坐标的不同 OpenGL中的纹理的坐标和Direct3D中的坐标是不一样的. 在Direct3D中.纹理坐标如下图所示.取值是0到1.坐标系原点在左上角. 物体表面坐标如下图所示.取

WPF体系结构

WPF使用多层体系结构.在顶层,应用程序与完全由托管C#代码编写的一组高层服务进行交互.至于将.NET对象转换为Direct3D纹理和三角形的实际工作,是在后台由一个名为milcore.dll的低级非托管组件完成. 上图显示了WPF应用程序中各层的工作情况. PresentationFramework.dll包含WPF顶层的类型,包括那些表示窗口.面板以及其他类型控件的类型.它还实现了高层编程抽象,如样式.开发人员直接使用的大部分类都来自这个程序集. PresentationCore.dll包含

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——Direct3D中的顶点缓存和索引缓存

第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物体模型的基本单元,而一个三角形有3个顶点,为了能够使用大量三角形组成三角形网格来描述物体,需要首先定义号三角形的顶点(Vertex),3个顶点确定一个三角形,顶点除了定义每个顶点的坐标位置外,还还含有颜色等其他属性. 在Direct3D中,顶点的具体表现形式是顶点缓存,顶点缓存保存了顶点数据的内存空

【转载】OLE控件在Direct3D中的渲染方法

原文:OLE控件在Direct3D中的渲染方法 Windows上的图形绘制是基于GDI的, 而Direct3D并不是, 所以, 要在3D窗口中显示一些Windows中的控件会有很多问题 那么, 有什么办法让GDI绘制的内容在3D中显示出来?反正都是图像, 总有办法实现的嘛! 前段时间在研究浏览器在游戏中的嵌入, 基本的思路就是在后台打开一个浏览窗口, 然后把它显示的内容拷贝到一张纹理上, 再把纹理在D3D中绘制出来, 至于事件处理就要另做文章了. 所以, 其它的Windows里的GDI绘制的东西

【转载】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:  

SDL2源码分析5:更新纹理(SDL_UpdateTexture())

===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源码分析2:窗体(SDL_Window) SDL2源码分析3:渲染器(SDL_Renderer) SDL2源码分析4:纹理(SDL_Texture) SDL2源码分析5:更新纹理(SDL_UpdateTexture()) SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy()) SDL2源