1 纹理坐标

类似BMP图像坐标系,左上为原点

纹理坐标为了规范化,范围限定在[0,1]之间,使用纹理的时候,需要修改顶点结构

struct ColorVetex

{

float x, y,z;

float _nx,_ny,_nz ;

float _u,_y ;

static const DWORD FVF;

}

const DWORD ColorVetex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL|D3DFVF_TEX1;

2创建并启用纹理

从文件中加载纹理数据

HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice,
LPCTSTR pSrcFile,
LPDIRECT3DTEXTURE9 * ppTexture
);

从内存中加载

HRESULT D3DXCreateTextureFromFileInMemory(
LPDIRECT3DDEVICE9 pDevice, LPCVOID
pSrcData, UINT SrcDataSize,
LPDIRECT3DTEXTURE9 * ppTexture);

从资源加载

HRESULT D3DXCreateTextureFromResource(
LPDIRECT3DDEVICE9 pDevice,
HMODULE hSrcModule,
LPCTSTR pSrcResource,
LPDIRECT3DTEXTURE9 * ppTexture);

设置问题。,DX最多可以设置8层纹理,从而组合得到更细致的图片

SetTexture(0,&_stonewall);

禁用纹理

SetTexture(0,0);

3 纹理过滤器

纹理三角形和屏幕三角形大小不适合的时候,通过这项技术,让二者适应

DX提供三种纹理过滤器:

最近点采样:默认情况,速度快,效果差

setsamplerstate(0,D3DSAMP_MAGFILTER,D3DTEXT_POINT);

setsamplerstate(0,D3DSAMP_MINFILTER,D3DTEXT_POINT);

线性纹理过滤器:线性插值,可以分为 放大和缩小

SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXT_LINEAR);

SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXT_LINEAR);

各向异性纹理过滤器:多线条采样技术,

setsamplerstate(0,D3DSAMP_MAGFILTER,D3DTEXT_ANISOTROPIC);

setsamplerstate(0,D3DSAMP_MINFILTER, D3DTEXT_ANISOTROPIC);

使用anisotropic filter时,需要对D3DSAMP_MAXANISOTROPIC 水平进行设置

4 多级渐进纹理

消除纹理和三角尺寸不一致的问题,创建多级渐进纹理,

多级渐进纹理过滤器:

Device->SetSamplerState(0,D3D_MIPFILTER,flag);

flag:D3DTEXT_NONE  :不适用

D3DTEXF_POINT 选族最近接的一级纹理,选择后使用指定的纹理过滤器进行处理
D3DTEXF_LINEAR 选择最近的两极纹理,用指定纹理过滤器过滤后,再对两极纹理进行线性融合

使用多级渐进纹理之后 DX会自动选用合适的尺寸纹理

5 寻址模式 :处理纹理坐标超过[0,1]范围的问题

有四种扩展模式:

重复寻址模式

Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP);

Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);

边界颜色模式

Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_BORDER);

Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);

Device->SetSamplerState(0, D3DSAMP_BORDERCOLOR,0x000000FF);

嵌位寻址模式

Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);

Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

镜像寻址模式

Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);

Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);

6纹理映射的过程

(1)构建具有纹理坐标的顶点

(2)读取纹理数据

(3)设置 缩小 放大过滤器,多级渐进纹理过滤器

(4)将纹理与物体关

下列代码为《directx9.0c游戏开发基础教程》第六章的代码:配合光源 纹理 ,物理的旋转采用更改观察者视角
 
 
#include "d3dUtility.h"
#include "cube.h"
#include "vertex.h"
 
//
// Globals
//
 
IDirect3DDevice9*     Device = 0; 
 
const int Width  = 640;
const int Height = 480;
 
Cube*              Box = 0;
IDirect3DTexture9* Tex = 0;
 
//
// Framework Functions
//
bool Setup()
{
    //
    // Create the cube.
    //
 
    Box = new Cube(Device);
 
    //
    // Set a directional light.
    //
 
    D3DLIGHT9 light;
    ::ZeroMemory(&light, sizeof(light));
    light.Type      = D3DLIGHT_DIRECTIONAL;
    light.Ambient   = D3DXCOLOR(0.1f, 0.8f, 0.8f, 1.0f);
    light.Diffuse   = D3DXCOLOR(0.9f, 1.0f, 1.0f, 1.0f);
    light.Specular  = D3DXCOLOR(0.0f, 0.2f, 1.0f, 1.0f);
    light.Direction = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
    Device->SetLight(0, &light);
    Device->LightEnable(0, true);
 
    Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
    Device->SetRenderState(D3DRS_SPECULARENABLE, true);
 
    //
    // Create texture.
    //
    D3DXCreateTextureFromFile(
        Device,
        "crate.jpg",
        &Tex);
 
    // 
    // Set Texture Filter States.
    //
 
    Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
 
    //
    // Set the projection matrix.
    //
 
    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
            &proj,
            D3DX_PI * 0.5f, // 90 - degree
            (float)Width / (float)Height,
            1.0f,
            1000.0f);
    Device->SetTransform(D3DTS_PROJECTION, &proj);
 
    return true;
}
 
void Cleanup()
{
    d3d::Delete<Cube*>(Box);
    d3d::Release<IDirect3DTexture9*>(Tex);
}
 
bool Display(float timeDelta)
{
    if( Device )
    {
        // 
        // Update the scene: update camera position.
        //
 
        static float angle  = (3.0f * D3DX_PI) / 2.0f;
        static float height = 2.0f;
    
        if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
            angle -= 0.5f * timeDelta;
 
        if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
            angle += 0.5f * timeDelta;
 
        if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
            height += 5.0f * timeDelta;
 
        if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
            height -= 5.0f * timeDelta;
 
        D3DXVECTOR3 position( cosf(angle) * 3.0f, height, sinf(angle) * 3.0f );
        D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
        D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
        D3DXMATRIX V;
        D3DXMatrixLookAtLH(&V, &position, &target, &up);
 
        Device->SetTransform(D3DTS_VIEW, &V);
 
        //
        // Draw the scene:
        //
 
        Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
        Device->BeginScene();
 
        Device->SetMaterial(&d3d::RED_MTRL);
        Device->SetTexture(0, Tex);
 
        Box->draw(0, 0, 0);
 
        Device->EndScene();
        Device->Present(0, 0, 0, 0);
    }
    return true;
}
 
//
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch( msg )
    {
    case WM_DESTROY:
        ::PostQuitMessage(0);
        break;
        
    case WM_KEYDOWN:
        if( wParam == VK_ESCAPE )
            ::DestroyWindow(hwnd);
        break;
    }
    return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
 
//
// WinMain
//
int WINAPI WinMain(HINSTANCE hinstance,
                   HINSTANCE prevInstance, 
                   PSTR cmdLine,
                   int showCmd)
{
    if(!d3d::InitD3D(hinstance,
        Width, Height, true, D3DDEVTYPE_HAL, &Device))
    {
        ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
        return 0;
    }
        
    if(!Setup())
    {
        ::MessageBox(0, "Setup() - FAILED", 0, 0);
        return 0;
    }
 
    d3d::EnterMsgLoop( Display );
 
    Cleanup();
 
    Device->Release();
 
    return 0;
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

DirectX 基础学习系列5 纹理映射的更多相关文章

  1. DirectX基础学习系列1

    1.3 基础 1.3.1表面 表面接口:     IDirect3DSurface9 获得表面信息:GetDesc(D3DSURFACE_DESC) 获得表面接口指针 :LockRect( D3DLO ...

  2. DirectX基础学习系列8 渐进网格以及外接体

    1 IUnknown--> ID3DXBUFFER D3D泛型接口: GetBufferPointer Retrieves a pointer to the data in the buffer ...

  3. directX基础学习系列7 网格(自己创建)

    D3DXMesh 以及 D3DXPMesh都是从ID3DXBaseMesh类中集成,mesh基本是对三角单元进行操作 ID3DXBaseMesh主要函数: HRESULT DrawSubset( DW ...

  4. DirectX 基础学习系列6 字体

    DIRECTX9自带ID3DXFONT类 内部调用GDI的接口,效率一般,但能够处理一些复杂的字体 HRESULT D3DXCreateFontIndirect( LPDIRECT3DDEVICE9 ...

  5. DirectX基础学习系列5 融合技术

    7.1融合方程 1概念 融合技术将当前光栅化像素的颜色与以前已光栅化并处于同一个位置的像素颜色进行合成,即将当前要进行光栅化的三角形单元与已写入后台的像素进行融合 2需要遵循的原则: (1)先绘制不需 ...

  6. DirectX基础学习系列4 颜色和光照

    4.1颜色表示 RGB颜色:D3DCOLOR  可以用宏D3DCOLOR_ARGB(a,r,g,b)  D3DCOLOR_XRGB(255,r,g,b) 另外一种浮点表示:D3DCOLORVALUE, ...

  7. DirectX基础学习系列2

    补充第一章矩阵内容 向量 1 3D空间向量,包含浮点数类型坐标 D3DXVECTOR-->D3DXVECTOR3 2向量的长度 D3DXVector3Length(const D3DXVECTO ...

  8. Linux基础学习系列目录导航

    Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ...

  9. Bootstrap基础学习 ---- 系列文章

    [Bootstrap基础学习]05 Bootstrap学习总结 [Bootstrap基础学习]04 Bootstrap的HTML和CSS编码规范 [Bootstrap基础学习]03 Bootstrap ...

随机推荐

  1. 远程登录 - telnet、mstsc等工具的使用及遇到的问题

    刚开始是看到老师在用mstsc远程登录oj服务器桌面对“远程登录”一系列的方法开始感兴趣.下面是我的学习笔记及遇到的一些问题的整理. Mstsc - 百度百科:http://baike.baidu.c ...

  2. Emacs简易教程

    Emacs简易教程阅读: 命令: $emacs 进入之后,输入: C-h t 这里,C-h表示按住[Ctrl]键的同时按h ####### 20090620 *退出: 输入“C-x C-c” *撤销: ...

  3. Laravel 4 系列入门教程(一)

    默认条件 本文默认你已经有配置完善的PHP+MySQL运行环境,懂得PHP网站运行的基础知识.跟随本教程走完一遍,你将会得到一个基础的包含登录的简单blog系统,并将学会如何使用一些强大的Larave ...

  4. 关于setTimeout的妙用前端函数节流

    最近在某团队忙于一个项目,有这么一个页面,采用传统模式开发(吐槽它为什么不用React),它的DOM操作比较多,然后性能是比较差的,尤其当你缩放窗口时,可怕的事情发生了,出现了卡顿,甚至浏览器瘫痪.为 ...

  5. Python 中的函数与类的方法

    注:本文转译自 Stackoverflow 上 Adding a Method to an Existing Object 的最佳回答. 在 python 中,def 定义的函数与类中的方法有很大的不 ...

  6. C语言中,宏和全局变量的区别是什么?

    全局变量 是可以在程序中任何地方使用 而且是可以修改的 宏定义也可以在任何地方使用 但是不能在之后修改 数据类型没有限制的 宏的例子:#define 宏名 宏体 #define PI 3.141592 ...

  7. SU Demos-02Filtering-07Sumedian

    不足之处,欢迎批评指正. 先看脚本内容: 脚本中用到的4个参数文件,是一系列x,t数据对,数组(x,t) 运行结果,

  8. 简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping

    题目传送门 题意:告诉若干个矩形的信息,问他们在凸多边形中所占的面积比例 分析:训练指南P272,矩形面积长*宽,只要计算出所有的点,用凸包后再求多边形面积.已知矩形的中心,向量在原点参考点再旋转,角 ...

  9. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

  10. HDU 3853(期望DP)

    题意: 在一个r*c的网格中行走,在每个点分别有概率向右.向下或停止不动.每一步需要的时间为2,问从左上角走到右下角的期望时间. SOL: 非常水一个DP...(先贴个代码挖个坑 code: /*== ...