游戏开发论坛

 找回密码
 立即注册
搜索
查看: 926|回复: 0

directx eg9

[复制链接]

17

主题

20

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2006-3-21 18:03:00 | 显示全部楼层 |阅读模式
#include <d3d9.h>
#include <d3dx9.h>

LPDIRECT3D9             g_pD3D       = NULL; // D3D对象
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; //        D3Ddevice
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // 顶点缓冲区
LPDIRECT3DTEXTURE9      g_pTexture   = NULL; // 纹理1
LPDIRECT3DTEXTURE9      g_pTexture2   = NULL; //纹理2

// 我们自定义的灵活顶点格式包含未经过坐标转换的顶点坐标和包含漫反射颜色值,2组顶点纹理坐标
#define D3DFVF_CUSTOMVERTEX   (D3DFVF_XYZ| D3DFVF_DIFFUSE| D3DFVF_TEX2)
struct CUSTOMVERTEX
{   FLOAT x, y, z;                         //未经过坐标转换的顶点坐标
        DWORD color;                       //顶点漫反射颜色值
        FLOAT u,v ;                                //顶点纹理坐标
        FLOAT u1,v1 ;                        //顶点纹理坐标

};


//-----------------------------------------------------------------------------
// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
   // 创建D3D对象.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

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

    // 建立结构来创建D3DDevice
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;

     // 创建D3DDevice
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }
    return S_OK;
}


HRESULT InitVB()
{

//创建纹理1&2
    if( FAILED( D3DXCreateTextureFromFileEx( g_pd3dDevice, "sword.jpg", 256,256,
                                                                        3,0,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT ,D3DX_DEFAULT,D3DX_DEFAULT,
                                                                        0xFF000000,0,0,&g_pTexture ) ) )
    {
            return E_FAIL;
    }
    if( FAILED( D3DXCreateTextureFromFileEx( g_pd3dDevice, "light.jpg", 256,256,
                                                                        3,0,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT ,D3DX_DEFAULT,D3DX_DEFAULT,
                                                                        0xFF000000,0,0,&g_pTexture2 ) ) )
    {
            return E_FAIL;
    }

    // 初始化顶点
        CUSTOMVERTEX g_Vertices[] =
        {
                { -2.5f,  -3.0f, 0.f, 0xffffffff,  0, 1,        0, 0},   
                { 2.5f ,  -3.0f, 0.f, 0xffffffff,  1, 1,        1, 0},       
                { -2.5f,  3.0f,  0.f, 0xffffffff,  0, 0,        0, 1},       
                { 2.5f,   3.0f,  0.f, 0xffffffff,  1, 0,        1, 1}
        };
        // 创建顶点缓冲区.
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                 0, D3DFVF_CUSTOMVERTEX,
                                                 D3DPOOL_DEFAULT, &g_pVB,NULL ) ) )
    {
        return E_FAIL;
    }
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
        return E_FAIL;
        //把顶点复制到顶点缓冲区中
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();

    return S_OK;
}

//-----------------------------------------------------------------------------
// Desc: 释放所有资源
//-----------------------------------------------------------------------------
VOID Cleanup()
{   if( g_pTexture != NULL )
        g_pTexture->Release();
   if( g_pTexture2 != NULL )
        g_pTexture2->Release();
    if( g_pVB != NULL )        
        g_pVB->Release();
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();
    if( g_pD3D != NULL )      
        g_pD3D->Release();
}


VOID SetupMatrices()
{
   //模型几何变换
    D3DXMATRIXA16 matWorld;
    D3DXMatrixIdentity( &matWorld );

        UINT  iTime  = timeGetTime() % 50000;
        FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 50000.0f;
        FLOAT fScale=(float)fabs(sin(fAngle));
        D3DXMatrixScaling( &matWorld, fScale,fScale,fScale );//缩放
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
//取景
    D3DXVECTOR3 vEyePt( 0.0f, .0f,-5 );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
//投影
    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

//-----------------------------------------------------------------------------
// Desc:
//-----------------------------------------------------------------------------
VOID Render()
{
   
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

        SetupMatrices();
   
    g_pd3dDevice->BeginScene();

    g_pd3dDevice->SetTexture( 0, g_pTexture );
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
        g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX,   0 );//使用第一组纹理坐标
        g_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);//纹理过滤

        D3DCAPS9  stCaps;
        g_pd3dDevice->GetDeviceCaps (&stCaps);
        int NumStages=stCaps.MaxTextureBlendStages;//查询显卡支持几层纹理
        if (NumStages>1)//大于一的话,也就是可以使用多层纹理
        {       
                g_pd3dDevice->SetTexture( 1, g_pTexture2 );
                g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_ADD);
                g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
                g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT);
                g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
                g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX,   1 );
                g_pd3dDevice->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
        }
       
        g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );//关闭CULL
        g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );//打开光照
   
    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

   
    g_pd3dDevice->EndScene();

   
    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}

//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: 消息
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
    }

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

//-----------------------------------------------------------------------------
// Desc: 主函数
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
   
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "Lid", NULL };
    RegisterClassEx( &wc );


    HWND hWnd = CreateWindow( "Lid", "Lid9 : multitexture",
                              WS_OVERLAPPEDWINDOW, 100, 100, 480, 480,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        
        if( SUCCEEDED( InitVB() ) )
        {
           
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

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

  
    Cleanup();
    UnregisterClass( "Lid", wc.hInstance );
    return 0;
}

sf_20063211837.rar

38.08 KB, 下载次数:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 23:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表