`
txf2004
  • 浏览: 6867276 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

D3D纹理基础

 
阅读更多

基本概念

纹理是增强计算机生成的三维图像的真实感的有力工具,早期计算机生成的三维图像看起来往往像是发亮的塑料,虽然这在当时也是比较先进的,但是它们缺乏各种纹路——如磨损、裂痕、指纹和污渍等,而这些纹路会增加三维物体的真实感。在计算机图形学中,纹理指的是一张表示物体表面细节的位图。

因为Direct3D中所有纹理都是位图,所以可以把任何位图贴到Direct3D图元的表面。例如,应用程序可以创建物体并使它们的表面看起来有木纹的样式。可以把草、泥土和岩石等纹理贴在构成山的图元的表面,这样就能得到看起来很真实的山坡。应用程序也可以用纹理创建其它的效果,如:路边的路标,悬崖边的岩层,或是地面上的大理石。

再举个例子:假如想在场景中放置一座砖墙,我们可能会在摄像机前创建一个正方形然后把它涂成红色。但是它看起来只是一个红色的正方形而不像一座砖墙,有许多砖块甚至还带有一个窗子的那种。这时,纹理就有了用武之地。所需的只是一个对象(正方形)和一个墙的纹理。

纹理的尺寸

理论上可以创建任何尺寸的纹理,但是为了提高效率,纹理最好是正方形(长和宽一样)的而且它的边长最好是2n次幂的形式,例如

16×1632×3264×64,128×128256×256

纹理坐标

大多数纹理,如位图,都是一个存放颜色值的二维数组。数组中的每个颜色值被称为texel。每个texel在纹理中有唯一的地址,可以认为这个地址是行和列的编号,它们分别被标记为uv

纹理坐标位于纹理空间中,也就是说,它们是相对于纹理坐标系的原点(0,0)的。当把纹理贴到三维空间中图元的表面时,纹理的texel必须先被映射到对象坐标系,然后再变换到屏幕坐标系的位置。

将Texel映射到屏幕空间

Direct3D直接把纹理中的texel映射到屏幕空间,这样就省略了中间步骤并极大地提高了效率。这个映射的过程实际上是一个反向映射,也就是说,系统根据每个像素在屏幕空间中的位置计算该像素在纹理空间中相应的texel的位置,然后对位于该点或该点附近的纹理颜色进行取样。取样的过程被称为纹理过滤。

纹理中每个texel的位置可以用它的texel坐标表示。但是为了把texel贴到图元表面,Direct3D需要所有的纹理中的texel具有相同的地址范围,所以Direct3D使用了一种通用的寻址方法。在这种寻址方法中,所有texel的地址都在闭区间0.01.0内。Direct3Duv值表示纹理坐标,这和用xy坐标表示二维笛卡尔坐标系非常相似。从技术上讲,系统事实上可以处理0.01.0范围外的纹理坐标,这时系统根据应用程序设置的纹理寻址模式来进行此类处理.

采用这种方法的结果是相同的纹理地址在不同的纹理中会映射到不同的texel坐标。在下图中,正在使用的纹理地址是(0.5,1.0)。但是,因为纹理的大小不同,所以该纹理地址映射到不同的texel。左边纹理的大小为5x5,纹理地址(0.5,1.0)映射到texel(2,4)。右边纹理的大小为7x7,纹理地址(0.5,1.0)映射到texel(3,6)

纹理映射

在场景中,我们可以把纹理应用到对象上,这个过程就叫做“纹理映射”。在此过程中,纹理坐标会被映射到顶点上,所以,顶点将额外增加两个值:UV。下面的图表是一个纹理映射到立方体的例子,例子中的立方体的顶点序号我们以前建立的立方体相同。

Direct3D中使用纹理

Direct3D中使用纹理要遵循以下步骤

1修改FVF和自定义顶点

2创建纹理

3设置纹理坐标

4在渲染时设置怎样渲染纹理

下面以是一个立方体的贴图示例

修改FVF和自定义顶点

再定义一个全局变量指向我们创建的纹理对象

创建纹理

Direct3D允许我们读图片文件来创建纹理,这需要用到函数D3DXCreateTextureFromFile();

函数原型:

为此,新建一个函数SetTexture()

该函数调用的时机应该是在创建了3D设备后,渲染场景之前。

InitD3D中调用SetTexture();

设置纹理坐标

对应于立方体来说,其纹理坐标是比较简单的。

修改的InitVertexBuffer函数

在渲染时设置怎样渲染纹理

纹理寻址模式

Direct3D应用程序可以把纹理坐标值赋给任何图元的任何顶点。一般来说,应用程序赋给顶点的uv纹理坐标值在0.01.0范围内,闭区间。但是,通过把纹理坐标值赋为此范围外的值,应用程序可以创建某些特殊纹理效果。

通过设置纹理寻址模式,应用程序可以控制当纹理坐标位于范围[0.0,1.0]外时希望Direct3D执行何种操作。例如,应用程序可以设置寻址模式,使纹理平铺于图元表面。

设置寻址模式

应用程序可以通过调用

IDirect3DDevice9::SetSamplerState方法设置每个纹理的纹理寻址模式。

函数原型

设置纹理寻址模式,需要把Type参数设置为:

D3DSAMP_ADDRESSU

D3DSAMP_ADDRESSV

Type参数设置为上两个值时,value参数可以设置为枚举类型

中的一个值

环绕纹理寻址模式

环绕纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_WRAP成员表示。它会使Direct3D在纹理坐标的整数边界重复使用该纹理。例如,设想应用程序创建了一个方的图元并把纹理坐标指定为(0.0,0.0),(0.0,3.0),(3.0,3.0)(3.0,0.0),把纹理寻址模式设置为D3DTADDRESS_WRAP会使纹理在uv方向都重复三次。

镜像纹理寻址模式

镜像纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_MIRROR成员表示,它会使Direct3D在纹理坐标的整数边界先对纹理进行镜像然后再重复使用。例如,设想应用程序创建了一个方的图元并把纹理坐标指定为(0.0,0.0),(0.0,3.0),(3.0,3.0)(3.0,0.0),把纹理寻址模式设置为D3DTADDRESS_MIRROR会使纹理在uv方向都重复三次,每一行和每一列的纹理都是相邻行和列的纹理的镜像。

截取纹理寻址模式

截取纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_CLAMP成员表示,它会使Direct3D把纹理坐标截取到[0.0,1.0]范围内,也就是说,这种模式只应用纹理一次,然后就重复使用纹理边缘处像素的颜色。例如,设想应用程序创建了一个方的图元并把纹理坐标指定为(0.0,0.0),(0.0,3.0),(3.0,3.0)(3.0,0.0),把纹理寻址模式设置为D3DTADDRESS_CLAMP会使纹理只被应用一次,列的顶端和行的末端处像素的颜色被相应地延伸至图元的顶端和右边。

边框颜色纹理寻址模式

边框颜色纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_BORDER成员表示,该寻址模式会使Direct3D对于位于[0.0,1.0]范围之外的纹理坐标使用一个被称为边框颜色的指定颜色。应用程序可以通过调用IDirect3DDevice9::SetSamplerState

方法设置边框颜色。在调用时要把第一个参数设为想要设置的纹理层的标识,把第二个参数设为D3DSAMP_ADDRESSU或者D3DSAMP_ADDRESSV,并把第三个参数设为D3DTADDRESS_BORDER

此时,边框默认的颜色是RGB(0,0,0)。在程序中可以通过调用SetSamplerState函数来设置边框的颜色,如下,将边框设置为红色

程序源代码下载地址:http://download.csdn.net/source/2920612

<!--EndFragment-->
分享到:
评论

相关推荐

    d3d_9基础代码学习

    适合学习d3d的同学们,比较基础,3d概念,向量,点,面,顶点,索引,纹理,shader都有基础介绍

    D3D顶点索引绘制椎体并进行纹理贴图

    整个资源确保可以完美运行,同时涉及了D3D很多基础知识,创建结构体,分配顶点缓存,读取纹理贴图,投影变换以及取景变换等等,代码配备了详细的注释可供大家参考学习。

    Direct纹理映射程序

    简单的纹理映射程序 .net环境下测试成功 D3D开发基础

    DIRECTX.9.0.3D游戏开发编程基础.pdf

    1.5.3 例程:D3D初始化 1.6 小结 第2章 绘制流水线 2.1 模型表示 2.1.1 顶点格式 2.1.2 三角形单元 2.1.3 索引 2.2 虚拟摄像机 2.3 绘制流水线 2.3.1 局部坐标系 2.3.2 世界坐标系 2.3.3 观察坐标系 ...

    directX实验四报告.doc

    mtrl.Emissive = d3d::BLACK; 运行结果如下 然后改变光的方向 增加一个蓝色点光源 项目2: DirectX 纹理实验 在项目1的程序基础上完成一下步骤: 新增一个立方体增加纹理,图片请自己准备。 纹理立方体的实现请才有...

    vc++ directx3d 图像程序源码

    介绍 Directx3D坐标变换, 纹理映射,Dshow 播放音乐 ,线程创建等基础知识.对初学D3D的朋友非常有帮助.

    DirectX3D基础知识

    DirectX的基础学习,从向量计算到矩阵变换,灯光纹理材质,音乐

    游戏编程中的物理建模(中文删节版)

    初始化 d3d_rigid_body对象 更新d3d_rigid_body对象 渲染d3d_rigid_body对象 小结(删除) 第十节:刚体碰撞 碰撞检测 粗糙近似 碰撞检测的改进 碰撞响应 线性碰撞响应 角度碰撞响应 组合...

    Introduction to 3D Game Programming with DirectX 9.0

    1.5.3 例程:D3D初始化 54 1.6 小结 56 第2章 绘制流水线 58 2.1 模型表示 59 2.1.1 顶点格式 60 2.1.2 三角形单元 60 2.1.3 索引 61 2.2 虚拟摄像机 62 2.3 绘制流水线 63 2.3.1 局部坐标系 64 2.3.2 ...

    Direct3D9初级教程

    这篇教程是为初学者准备的,只要会简单的 VC++编程以及一点立体几何的基础知识即 可。通过它,可以了解到 Direct3D 的基本概念,学会绘制简单的几何图形,并掌握光源、 材质和纹理的基本用法。绝对好东东,下了不...

    3D游戏从头编-网上收集

    3D游戏从头编-网上收集,很基础. 第一回:开发环境 第二回:3D基本概念 ...第三回:第一个D3D程序 第四回:渲染顶点 第五回:渲染索引顶点 第六回:摄象机 第七回:灯光 第八回:纹理 第九回:3D模型(.x)

    3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,...

    VC视频音频开发实用工程案例精选光盘源码

    通过本章的学习,读者能够对D3D程序设计有比较深刻的了解,能够开发出比较复杂的应用程序,制作出绚丽的图形效果。 第12章,介绍了用DirectSound进行编程所要采取的一般步骤,讲解了通过DirectSoundSDK 9.0实现...

    AlpacaRenderer:光栅化软渲染器

    (仅中文) 一个简单的光栅化软渲染器 ... D3D就像左手 NDC Z范围(0,1) 使用行向量,例如vMVP #特征 向量,矩阵,颜色 模型,视图,项目转换,视口映射 简单的CVV剔除 三角形栅格化 ZBuffer 透视校正纹理贴图

Global site tag (gtag.js) - Google Analytics