zoukankan      html  css  js  c++  java
  • [Direct3D 9.0]第六章 纹理

    纹理技术是一种允许我们为三角形赋予图像数据的技术。例如,我们能够常见一个立方体并且通过对它的每一个面创建一个纹理来把他变成一个木箱。

    在Direct3D中一个威力是通过IDirect3DTexture9接口来实现的。一个纹理是一个类似像素矩阵的表面它能够被映射到三角形上。

    纹理坐标

    Direct3D使用一个纹理坐标系统。它是由用水平方向的u轴和竖直方向的v轴构成。由u,v坐标决定纹理上的元素,他被叫做texel。如下图

    clip_image002

    为了加入纹理,需要在原有的顶点结构里加入u和v

    clip_image004

    创建并赋予材质

    纹理数据通常是从存储在磁盘中的图片文件中读取的,且被读进IDirect3DTexture9对象中。我们能够使用下面的D3DX函数完成这项工作。

    clip_image006

    这个函数可以读取下面图片格式中的任意一种:BMP, DDS, DIB, JPG, PNG, TGA

    设置当前纹理,我们使用下面的方法。

    clip_image008

    为了销毁一个纹理,我们设置pTexture为0。

    过滤器

    为了防止纹理三角形和屏幕三角形大小不同引起的变形,Direct3D中用过滤来使变形变得平滑。

    Direct3D提供了三种不同的过滤器,每种都提供了一个不同品质级别。越好的品质级别越慢。

    *Nearest point sampling----这是默认的过滤方法且返回最差的效果。

    Linear filtering------推荐使用的

    Anisotropic filtering-------过滤产生最好的效果。

    Mipmaps

    为了使屏幕三角形和纹理三角形差异变小,我们为纹理创建mipmaps链。也就是将一个纹理创建成连续变小的纹理,但是对他们的等级进行定制过滤。

    设置mipmaps

    Device->SetSamplerState(0, D3DSAMP_MIPFILTER, Filter);

    在Filter 处你能用下面三个选项中的一个:

    l  D3DTEXF_NONE——不使用mipmap。

    l D3DTEXF_POINT——通过使用这个过滤器, Direct3D 将选择与 屏幕三角形大小最接近的mipmap 等级。一旦等级选定了,Direct3D 就将按照指定的过滤器进行缩小和放大过滤。

    l  D3DTEXF_LINEAR ——通过使用这个过滤器,Direct3D 将选择两个最接近的mipmap 等级,缩小和放大过滤每个等级,然后线性联合计算它们两个等级来得到最终的颜色值。

    在Direct3D中使用Mipmaps

    在Direct3D中实用Mipmpas是很简单的。假如你的显卡支持Mipmaps,D3DXCreateTextureFromFile将为你产生一个Mipmap链。Direct3D自动选择与屏幕三角形最匹配的Mipmaps。

    寻址模式

    纹理坐标可以在[0, 1]的范围之外i,他通过Direct3D的寻址模式来定义。寻址模式如下

    l 环绕纹理寻址模式

    l 边框颜色纹理寻址模式

    l 截取纹理寻址模式

    l 景象纹理寻址模式

    clip_image010

    clip_image011

    在这些图片中,纹理坐标通过(0,0) (0, 3) (3,0) (3,3)顶点来定义。在u轴和v轴上方块又被分成子块放进3X3的矩阵中。

    下面的代码片段列举的是怎样设置这四种寻址模式:

    image

  • 相关阅读:
    mac 配置 iterm2
    python面试题
    待办事项--flask
    八皇后问题c语言版(xcode下通过)
    对分布式一些理解
    观察者模式
    用redis实现悲观锁(后端语言以php为例)
    只用200行Go代码写一个自己的区块链!(转)
    php的生命周期的概述
    linux网络编程1 最简单的socket编程
  • 原文地址:https://www.cnblogs.com/wangke1020/p/3690367.html
Copyright © 2011-2022 走看看