Direct3D---纹理映射

//--------------------------------------------------------------------------------------
// 【纹理绘制四步曲之一】:顶点的定义    
//--------------------------------------------------------------------------------------
struct CUSTOMVERTEX 
{
    FLOAT _x, _y, _z;               // 顶点的位置
    FLOAT _u, _v;                   // 纹理坐标
    CUSTOMVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v)
        : _x(x), _y(y), _z(z), _u(u), _v(v) {}
};
//D3DFVF_TEX1: 一层纹理
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
// 【纹理绘制四步曲之二】:顶点的访问    
    //--------------------------------------------------------------------------------------
    //填充顶点缓存
    CUSTOMVERTEX* pVertices;
    if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(CUSTOMVERTEX), (void**)&pVertices, 0 ) ) )
        return E_FAIL;

    // 正面顶点数据
    // 前3个数据为顶点位置,后2个数据为纹理坐标
    pVertices[0] = CUSTOMVERTEX(-10.0f,  10.0f, -10.0f, 0.0f, 0.0f);
    pVertices[1] = CUSTOMVERTEX( 10.0f,  10.0f, -10.0f, 2.0f, 0.0f);
    pVertices[2] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 2.0f, 2.0f);
    pVertices[3] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 0.0f, 2.0f);

    // 背面顶点数据
    pVertices[4] = CUSTOMVERTEX( 10.0f,  10.0f, 10.0f, 0.0f, 0.0f);
    pVertices[5] = CUSTOMVERTEX(-10.0f,  10.0f, 10.0f, 2.0f, 0.0f);
    pVertices[6] = CUSTOMVERTEX(-10.0f, -10.0f, 10.0f, 2.0f, 2.0f);
    pVertices[7] = CUSTOMVERTEX( 10.0f, -10.0f, 10.0f, 0.0f, 2.0f);

    // 顶面顶点数据
    pVertices[8]  = CUSTOMVERTEX(-10.0f, 10.0f,  10.0f, 0.0f, 0.0f);
    pVertices[9]  = CUSTOMVERTEX( 10.0f, 10.0f,  10.0f, 2.0f, 0.0f);
    pVertices[10] = CUSTOMVERTEX( 10.0f, 10.0f, -10.0f, 2.0f, 2.0f);
    pVertices[11] = CUSTOMVERTEX(-10.0f, 10.0f, -10.0f, 0.0f, 2.0f);

    // 底面顶点数据
    pVertices[12] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 0.0f, 0.0f);
    pVertices[13] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 2.0f, 0.0f);
    pVertices[14] = CUSTOMVERTEX( 10.0f, -10.0f,  10.0f, 2.0f, 2.0f);
    pVertices[15] = CUSTOMVERTEX(-10.0f, -10.0f,  10.0f, 0.0f, 2.0f);

    // 左侧面顶点数据
    pVertices[16] = CUSTOMVERTEX(-10.0f,  10.0f,  10.0f, 0.0f, 0.0f);
    pVertices[17] = CUSTOMVERTEX(-10.0f,  10.0f, -10.0f, 1.0f, 0.0f);
    pVertices[18] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 1.0f, 1.0f);
    pVertices[19] = CUSTOMVERTEX(-10.0f, -10.0f,  10.0f, 0.0f, 1.0f);

    // 右侧面顶点数据
    pVertices[20] = CUSTOMVERTEX( 10.0f,  10.0f, -10.0f, 0.0f, 0.0f);
    pVertices[21] = CUSTOMVERTEX( 10.0f,  10.0f,  10.0f, 1.0f, 0.0f);
    pVertices[22] = CUSTOMVERTEX( 10.0f, -10.0f,  10.0f, 1.0f, 1.0f);
    pVertices[23] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 0.0f, 1.0f);

    g_pVertexBuffer->Unlock();
//--------------------------------------------------------------------------------------
    // 【纹理绘制四步曲之三】:纹理的创建
    //--------------------------------------------------------------------------------------
    // 创建纹理
    //g_pd3dDevice: D3Drect3D设备对象
    //L"pal5q.jpg": 创建纹理的图标文件名字的字符串
    //0: 创建纹理对象的宽度,0表示使用贴图宽度
    //0: 创建纹理对象的高度,0表示使用贴图高度
    //6: 创建纹理的渐进级别
    //0: 纹理的使用方式,一般是0
    //D3DFMT_X8R8G8B8: 纹理中保存每个颜色成分所使用的位数
    //D3DPOOL_MANAGED: 如何管理纹理,一般为D3DPOOL_MANAGED
    //D3DX_DEFAULT: 图像像素的过滤方式
    //D3DX_DEFAULT: MIP像素过滤方式
    //0xFF000000: 透明色,设定这个颜色,在显示时,这图像中的这个颜色将忽略
    //0: 记录载入图片信息,通常为NULL
    //0: 记录调色板信息,通常为NULL
    //g_pMipTexture: 保存最终创建的纹理
    D3DXCreateTextureFromFileEx(g_pd3dDevice, L"pal5q.jpg", 0, 0, 6, 0, D3DFMT_X8R8G8B8, 
        D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0xFF000000, 0, 0, &g_pMipTexture);

//各向异性过滤
    //设置最大各项异性的程度值
    g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 3);
    //0: 为哪一层纹理设置采样状态
    //D3DSAMP_MAGFILTER: 对哪种纹理采样属性进行操作,设置放大过滤器
    //D3DTEXF_ANISOTROPIC: 对第二个属性进行值的设定
    g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC); 
    //D3DSAMP_MINFILTER: 对哪种纹理采样属性进行操作,设置缩小过滤器
    g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);

    //线性纹理过滤
    //g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    //g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

    //最近点采样过滤
    //g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
    //g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);

    //渐进纹理过滤
    //g_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
    //g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, 16);
//--------------------------------------------------------------------------------------
    // 【纹理绘制四步曲之四】:纹理的启用
    //--------------------------------------------------------------------------------------
    //0: 指定了应用纹理是哪一层
    //g_pMipTexture: 将要启用纹理的IDrect3DBaseTexture9接口对象,为第二步中定义过的g_pMipTexture参数
    g_pd3dDevice->SetTexture(0, g_pMipTexture);  //启用纹理

第一步为全局变量

第二步与第三步位于函数Objects_Init()中,Objects_Init()是渲染资源初始化函数,在此函数中进行要被渲染的物体的资源的初始化
Objects_Init()调用位置:Direct3D_Init()末尾,即Direct3D初始化完成后。
Direct3D_Init():Direct3D初始化函数,进行Direct3D的初始化。
Direct3D_Init()调用位置:Windows窗口创建后,即函数CreateWindow()后面

最后一步位于函数Direct3D_Render()中,Direct3D_Render()是使用Direct3D进行渲染的函数,位于该函数的“【Direct3D渲染五步曲之三】:正式绘制,利用顶点缓存绘制图形 ”中
Direct3D_Render()调用位置: 窗口过程函数WndProc()中,接收到消息WM_PAINT后

设置纹理的寻址方式:

// 根据键盘按键的按下,设置为纹理寻址方式
    if (g_pDInput->IsKeyDown(DIK_1))  //键盘上1键被按下
    {
        // 设置重复纹理寻址模式
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
    }
    if (g_pDInput->IsKeyDown(DIK_2)) //键盘上2键被按下
    {
        // 设置镜像纹理寻址模式
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
    }
    if (g_pDInput->IsKeyDown(DIK_3)) //键盘上3键被按下
    {
        // 设置夹取纹理寻址模式
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
    }
    if (g_pDInput->IsKeyDown(DIK_4)) //键盘上4键被按下
    {
        // 设置边框纹理寻址模式
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
    }

位于函数Direct3D_Update()中
Direct3D_Update(): 不是即时渲染代码但是需要即时调用的,如按键后的坐标的更改,都放在这里。
Direct3D_Update()调用位置:
WinMain中的消息循环过程:

//【5】消息循环过程
    MSG msg = { 0 };  //初始化msg
    while( msg.message != WM_QUIT )         //使用while循环
    {
        if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
        {
            TranslateMessage( &msg );       //将虚拟键消息转换为字符消息
            DispatchMessage( &msg );        //该函数分发一个消息给窗口程序。
        }
        else
        {
            Direct3D_Update(hwnd);          //调用更新函数,进行画面的更新
            Direct3D_Render(hwnd);          //调用渲染函数,进行画面的渲染    
        }
    }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值