zoukankan      html  css  js  c++  java
  • D3D中的纹理映射(3)

    该例程演示了怎样对一个立方体映射板条纹理。

    截图:

    vertex.h:

    #ifndef __VERTEX_H__
    #define __VERTEX_H__
    class cTextureVertex
    {
    public:
    float m_x, m_y, m_z;
    float m_nx, m_ny, m_nz;
    float m_u, m_v; // texture coordinates
        cTextureVertex() { }
        cTextureVertex(float x, float y, float z,
    float nx, float ny, float nz,
    float u, float v)
        {
            m_x  = x;  m_y  = y;  m_z  = z;
            m_nx = nx; m_ny = ny; m_nz = nz;
            m_u  = u;  m_v  = v;
        }   
    };
    #define TEXTURE_VERTEX_FVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)
    #endif

    cube.h:

    #ifndef __CUBE_H__
    #define __CUBE_H__
    #include <d3dx9.h>
    class cCube
    {
    public:
        cCube(IDirect3DDevice9* d3d_device);
    ~cCube();
    void draw(const D3DMATRIX* world, const D3DMATERIAL9* material, IDirect3DTexture9* texture);
    private:
        IDirect3DDevice9*        m_d3d_device;
        IDirect3DVertexBuffer9*    m_vertex_buffer;
        IDirect3DIndexBuffer9*    m_index_buffer;
    };
    #endif

    cube.cpp:

    /****************************************************************************
      Provides an interface to create and render a cube.
    ****************************************************************************/
    #include "cube.h"
    #include "vertex.h"
    cCube::cCube(IDirect3DDevice9* d3d_device)
    {
        m_d3d_device = d3d_device;
        m_d3d_device->CreateVertexBuffer(24 * sizeof(cTextureVertex), D3DUSAGE_WRITEONLY, TEXTURE_VERTEX_FVF,
            D3DPOOL_MANAGED, &m_vertex_buffer, NULL);
        cTextureVertex* v;
        m_vertex_buffer->Lock(0, 0, (void**)&v, 0);
    // build box
    // fill in the front face vertex data
        v[0] = cTextureVertex(-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
        v[1] = cTextureVertex(-1.0f,  1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
        v[2] = cTextureVertex( 1.0f,  1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);
        v[3] = cTextureVertex( 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
    // fill in the back face vertex data
        v[4] = cTextureVertex(-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
        v[5] = cTextureVertex( 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f);
        v[6] = cTextureVertex( 1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
        v[7] = cTextureVertex(-1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);
    // fill in the top face vertex data
        v[8]  = cTextureVertex(-1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);
        v[9]  = cTextureVertex(-1.0f, 1.0f,  1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);
        v[10] = cTextureVertex( 1.0f, 1.0f,  1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f);
        v[11] = cTextureVertex( 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);
    // fill in the bottom face vertex data
        v[12] = cTextureVertex(-1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f);
        v[13] = cTextureVertex( 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f);
        v[14] = cTextureVertex( 1.0f, -1.0f,  1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f);
        v[15] = cTextureVertex(-1.0f, -1.0f,  1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
    // fill in the left face vertex data
        v[16] = cTextureVertex(-1.0f, -1.0f,  1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f);
        v[17] = cTextureVertex(-1.0f,  1.0f,  1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
        v[18] = cTextureVertex(-1.0f,  1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f);
        v[19] = cTextureVertex(-1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    // fill in the right face vertex data
        v[20] = cTextureVertex( 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f);
        v[21] = cTextureVertex( 1.0f,  1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
        v[22] = cTextureVertex( 1.0f,  1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f);
        v[23] = cTextureVertex( 1.0f, -1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f);
        m_vertex_buffer->Unlock();
        m_d3d_device->CreateIndexBuffer(36 * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED,
    &m_index_buffer, NULL);
        WORD* index_ptr = NULL;
        m_index_buffer->Lock(0, 0, (void**)&index_ptr, 0);
    // fill in the front face index data
        index_ptr[0] = 0; index_ptr[1] = 1; index_ptr[2] = 2;
        index_ptr[3] = 0; index_ptr[4] = 2; index_ptr[5] = 3;
    // fill in the back face index data
        index_ptr[6] = 4; index_ptr[7]  = 5; index_ptr[8]  = 6;
        index_ptr[9] = 4; index_ptr[10] = 6; index_ptr[11] = 7;
    // fill in the top face index data
        index_ptr[12] = 8; index_ptr[13] = 9; index_ptr[14] = 10;
        index_ptr[15] = 8; index_ptr[16] = 10; index_ptr[17] = 11;
    // fill in the bottom face index data
        index_ptr[18] = 12; index_ptr[19] = 13; index_ptr[20] = 14;
        index_ptr[21] = 12; index_ptr[22] = 14; index_ptr[23] = 15;
    // fill in the left face index data
        index_ptr[24] = 16; index_ptr[25] = 17; index_ptr[26] = 18;
        index_ptr[27] = 16; index_ptr[28] = 18; index_ptr[29] = 19;
    // fill in the right face index data
        index_ptr[30] = 20; index_ptr[31] = 21; index_ptr[32] = 22;
        index_ptr[33] = 20; index_ptr[34] = 22; index_ptr[35] = 23;
        m_index_buffer->Unlock();
    }
    cCube::~cCube()
    {
    if(m_vertex_buffer)
        {
            m_vertex_buffer->Release();
            m_vertex_buffer = NULL;
        }
    if(m_index_buffer)
        {
            m_index_buffer->Release();
            m_index_buffer = NULL;
        }
    }
    void cCube::draw(const D3DMATRIX* world, const D3DMATERIAL9* material, IDirect3DTexture9* texture)
    {
    if(world)
            m_d3d_device->SetTransform(D3DTS_WORLD, world);
    if(material)
            m_d3d_device->SetMaterial(material);
    if(texture)
            m_d3d_device->SetTexture(0, texture);
        m_d3d_device->SetStreamSource(0, m_vertex_buffer, 0, sizeof(cTextureVertex));
        m_d3d_device->SetIndices(m_index_buffer);
        m_d3d_device->SetFVF(TEXTURE_VERTEX_FVF);
        m_d3d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12);
    }

    TexCube.cpp:

    /**************************************************************************************
      Renders a textured cube.  Demonstrates creating a texture, setting texture filters,
      enabling a texture, and texture coordinates.  Use the arrow keys to orbit the scene.
    **************************************************************************************/
    #include "d3dUtility.h"
    #include "cube.h"
    #include "vertex.h"
    #pragma warning(disable : 4100)
    const int WIDTH  = 640;
    const int HEIGHT = 480;
    IDirect3DDevice9*        g_d3d_device;
    cCube*                    g_cube;
    IDirect3DTexture9*        g_d3d_texture;
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    bool setup()
    {   
        g_cube = new cCube(g_d3d_device);
    // set a directional light
        D3DLIGHT9 light;
        ZeroMemory(&light, sizeof(light));
        light.Type        = D3DLIGHT_DIRECTIONAL;
        light.Ambient   = D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f);
        light.Diffuse   = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
        light.Specular  = D3DXCOLOR(0.2f, 0.2f, 0.2f, 1.0f);
        light.Direction    = D3DXVECTOR3(1.0f, -1.0f, 0.0f);
    // set and enable the light
        g_d3d_device->SetLight(0, &light);
        g_d3d_device->LightEnable(0, TRUE);
    // turn off specular lighting and instruct Direct3D to renormalize normals
        g_d3d_device->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);
        g_d3d_device->SetRenderState(D3DRS_SPECULARENABLE, TRUE);
        D3DXCreateTextureFromFile(g_d3d_device, "crate.jpg", &g_d3d_texture);
    // set texture filter states
        g_d3d_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        g_d3d_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        g_d3d_device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
    // set the projection matrix
        D3DXMATRIX proj;
        D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, (float)WIDTH/HEIGHT, 1.0f, 1000.0f);
        g_d3d_device->SetTransform(D3DTS_PROJECTION, &proj);
    return true;
    }
    void cleanup()
    {
        safe_delete<cCube*>(g_cube);
        safe_release<IDirect3DTexture9*>(g_d3d_texture);
    }
    bool display(float time_delta)
    {
    // 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 * time_delta;
    if(GetAsyncKeyState(VK_RIGHT) & 0x8000f)
            angle += 0.5f * time_delta;
    if(GetAsyncKeyState(VK_UP) & 0x8000f)
            height += 5.0f * time_delta;
    if(GetAsyncKeyState(VK_DOWN) & 0x8000f)
            height -= 5.0f * time_delta;
        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 view_matrix;
        D3DXMatrixLookAtLH(&view_matrix, &position, &target, &up);
        g_d3d_device->SetTransform(D3DTS_VIEW, &view_matrix);
    // draw the scene
        g_d3d_device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
        g_d3d_device->BeginScene();
        g_cube->draw(NULL, &WHITE_MATERIAL, g_d3d_texture);       
        g_d3d_device->EndScene();
        g_d3d_device->Present(NULL, NULL, NULL, NULL);
    return true;
    }
    LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
    {
    switch(msg)
        {
    case WM_DESTROY:
            PostQuitMessage(0);
    break;
    case WM_KEYDOWN:
    if(word_param == VK_ESCAPE)
                DestroyWindow(hwnd);
    break;
        }
    return DefWindowProc(hwnd, msg, word_param, long_param);
    }
    int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
    {
    if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_d3d_device))
        {
            MessageBox(NULL, "init_d3d() - failed.", 0, MB_OK);
    return 0;
        }
    if(! setup())
        {
            MessageBox(NULL, "Steup() - failed.", 0, MB_OK);
    return 0;
        }
        enter_msg_loop(display);
        cleanup();
        g_d3d_device->Release();
    return 0;
    }

    下载源程序

  • 相关阅读:
    mfc判断当前程序是否正在运行
    mfc通过信号量保证线程同步
    delete和析构函数
    获取当前运行的exe路径
    mfc移动文件夹
    Cmake实现样例
    安装Node.js以及Hexo
    分类与回归的关系和区别
    從文本到視覺:各領域最前沿的論文集合
    ubuntu 终端$换行
  • 原文地址:https://www.cnblogs.com/flying_bat/p/1115368.html
Copyright © 2011-2022 走看看