zoukankan      html  css  js  c++  java
  • D3D中的光照(4)

    点光源示例,截图:

    源代码:

    /**************************************************************************************
      Demonstrates using a point light with D3DX objects. 
      You can orbit the scene using the left and right arrow keys. 
      In addition you can elevate the camera with the up and down arrow keys. 
    **************************************************************************************/
    #include "d3dUtility.h"
    #pragma warning(disable : 4100)
    #define MESH_TEAPOT        0
    #define MESH_SPHERE        1
    #define MESH_TORUS        2
    #define MESH_CYLINDER    3
    #define NUM_MESH        4
    const int WIDTH  = 640;
    const int HEIGHT = 480;
    IDirect3DDevice9*        g_d3d_device  = NULL;
    ID3DXMesh*                g_object_meshes[NUM_MESH];
    D3DXMATRIX                g_world_matrices[NUM_MESH];
    D3DMATERIAL9            g_materials[NUM_MESH];
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    bool setup()
    {   
    // create objects
        D3DXCreateTeapot(g_d3d_device, &g_object_meshes[MESH_TEAPOT], NULL);
        D3DXCreateSphere(g_d3d_device, 1.0f, 20, 20, &g_object_meshes[MESH_SPHERE], NULL);
        D3DXCreateTorus(g_d3d_device, 0.5f, 1.0f, 20, 20, &g_object_meshes[MESH_TORUS], NULL);
        D3DXCreateCylinder(g_d3d_device, 0.5f, 1.0f, 2.0f, 20, 20, &g_object_meshes[MESH_CYLINDER], NULL);
    // build world matrices - position the objects in world space
        D3DXMatrixTranslation(&g_world_matrices[MESH_TEAPOT],     0.0f,  2.0f, 0.0f);
        D3DXMatrixTranslation(&g_world_matrices[MESH_SPHERE],     0.0f, -2.0f, 0.0f);
        D3DXMatrixTranslation(&g_world_matrices[MESH_TORUS],    -3.0f,  0.0f, 0.0f);
        D3DXMatrixTranslation(&g_world_matrices[MESH_CYLINDER],     3.0f,  0.0f, 0.0f);
    // setup the object's materials
        g_materials[MESH_TEAPOT]   = RED_MATERIAL;
        g_materials[MESH_SPHERE]   = BLUE_MATERIAL;
        g_materials[MESH_TORUS]    = GREEN_MATERIAL;
        g_materials[MESH_CYLINDER] = YELLOW_MATERIAL;
    // setup a directional light, note that the point light is positioned at the origin.
        D3DXVECTOR3 light_direction(0.0f, 0.0f, 0.0f);
        D3DXCOLOR   color = WHITE;
        D3DLIGHT9   point_light = init_point_light(&light_direction, &color);
    // set and enable the light
        g_d3d_device->SetLight(0, &point_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, FALSE);
    // set the projection matrix
        D3DXMATRIX proj;
        D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.25f, (float)WIDTH/HEIGHT, 1.0f, 1000.0f);
        g_d3d_device->SetTransform(D3DTS_PROJECTION, &proj);
    return true;
    }
    void cleanup()
    {
    for(int i = 0; i < NUM_MESH; i++)
            safe_release<ID3DXMesh*>(g_object_meshes[i]);
    }
    bool display(float time_delta)
    {
    // update the scene: update camera position
    static float angle = (3.0f * D3DX_PI) / 2.0f;
    static float height = 5.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) * 7.0f, height, sinf(angle) * 7.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();
    for(int i = 0; i < NUM_MESH; i++)
        {
    // set material and world matrix for ith object, then render the ith object.
            g_d3d_device->SetMaterial(&g_materials[i]);
            g_d3d_device->SetTransform(D3DTS_WORLD, &g_world_matrices[i]);
            g_object_meshes[i]->DrawSubset(0);
        }
        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;
    }

    下载源程序

  • 相关阅读:
    67.ORM查询条件:range的使用,使用make_aware将navie time 转换为aware time
    65.ORM查询条件:gte,gt,lte和lt的使用
    66.Python中startswith和endswith的使用
    63.Python中contains和icontains
    64.Python中ORM查询条件:in和关联模型
    77.Q表达式详解
    76.Python中F表达式详解
    75.Python中ORM聚合函数详解:Sum
    74.Python中ORM聚合函数详解:Max,Min
    Cadence SPB 入门
  • 原文地址:https://www.cnblogs.com/flying_bat/p/1115375.html
Copyright © 2011-2022 走看看