D3D 的 一个win32 框架程序

#include "stdafx.h"
#include "D3D_Win32_Frame.h"




//-----------------------------------------------------------------------------
// File: CreateDevice.cpp
//
// Desc: This is the first tutorial for using Direct3D. In this tutorial, all
//       we are doing is creating a Direct3D device and using it to clear the
//       window.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include <d3d9.h>
#include <d3dx9.h>
#pragma warning( disable : 4996 ) // disable deprecated warning
#include <strsafe.h>
#pragma warning( default : 4996 )


#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")


//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9         g_pD3D = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; // Our rendering device

struct Vertex
{
    float x,y,z;
    DWORD colour;
};
#define VERTEX_FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)



//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{

    // Create the D3D object, which is needed to create the D3DDevice.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    {
        return E_FAIL;
    }


    // Set up the structure used to create the D3DDevice. Most parameters are
    // zeroed out. We set Windowed to TRUE, since we want to do D3D in a
    // window, and then set the SwapEffect to "discard", which is the most
    // efficient method of presenting the back buffer to the display.  And
    // we request a back buffer format that matches the current desktop display
    // format.
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    //d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    // Create the Direct3D device. Here we are using the default adapter (most
    // systems only have one, unless they have multiple graphics hardware cards
    // installed) and requesting the HAL (which is saying we want the hardware
    // device rather than a software one). Software vertex processing is
    // specified since we know it will work on all cards. On cards that support
    // hardware vertex processing, though, we would see a big performance gain
    // by specifying hardware vertex processing.
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    // Device state would normally be set here

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}




//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(125,125,125),1.0,0);

    const float PI =3.1415926;
    D3DXMATRIX perMat;
    //D3DXMatrixPerspectiveFovLH(&perMat, PI/2, 1, 1.0, 500);
    D3DXMatrixOrthoLH(&perMat,500,500,1.0,500);
    g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&perMat);


    D3DXVECTOR3 vEyePt( 0.0f, 0.0f,0.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 1.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );


    //三角形
    IDirect3DVertexBuffer9 *pVB = NULL;
    if( FAILED(g_pd3dDevice->CreateVertexBuffer(3*(sizeof Vertex),0,VERTEX_FVF,D3DPOOL_DEFAULT,&pVB,NULL)) )
    {
        //create VB failed.
        MessageBox(NULL,_T("failed VB."),NULL,0);
    }

//     Vertex cvVertices[] =
//     {
//         {-100.0f, 0.0f, 50.0f ,D3DCOLOR_XRGB(255, 0, 0)},
//         {100.0f, 0.0f,  50.0f ,D3DCOLOR_XRGB(255, 0, 0)},
//         {0.0f, 100.0f,  50.0f ,D3DCOLOR_XRGB(255, 0, 0)},
//     };

    Vertex cvVertices[] =
    {
        {0.0f, 100.0f,  50.0f ,D3DCOLOR_XRGB(255, 0, 0)},
        {100.0f, 0.0f,  50.0f ,D3DCOLOR_XRGB(255, 0, 0)},
        {-100.0f, 0.0f, 50.0f ,D3DCOLOR_XRGB(255, 0, 0)},
    };

    void *pVertex = NULL;
    pVB->Lock(0,sizeof cvVertices,&pVertex,0);
    
    memcpy(pVertex,cvVertices,sizeof cvVertices);

    pVB->Unlock();



    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here
        // End the scene

        g_pd3dDevice->SetStreamSource(0,pVB,0,sizeof Vertex);
        g_pd3dDevice->SetFVF(VERTEX_FVF);
        g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

    pVB->Release();
}



//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_DESTROY:
        Cleanup();
        PostQuitMessage( 0 );
        return 0;

    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}




//-----------------------------------------------------------------------------
// Name: wWinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc =
    {
        sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,
        GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
        L"D3D Tutorial", NULL
    };
    RegisterClassEx( &wc );

    int scrWidth=GetSystemMetrics(SM_CXSCREEN);
    int scrHeight=GetSystemMetrics(SM_CYSCREEN);

    RECT rect;
    rect.left = scrWidth / 4;
    rect.top = scrHeight / 4;
    rect.bottom = scrHeight - rect.top;
    rect.right = scrWidth - rect.left;

    // Create the application's window
    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
        WS_OVERLAPPEDWINDOW,rect.left,rect.top,scrWidth/2, scrHeight/2,
        NULL, NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        // Enter the message loop
        MSG msg;
        PeekMessage(&msg,0,0,0,PM_NOREMOVE);

        while( msg.message != WM_QUIT )
        {
            if (PeekMessage( &msg, NULL, 0, 0,PM_REMOVE ))
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            else
            {
                Render();
            }

        }
    }

    UnregisterClass( L"D3D Tutorial", wc.hInstance );
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值