⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 自己做的一个3D场景
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <mmsystem.h>
#include <math.h>
#include <stdio.h>
#include "Mesh.h"
#include "Girl.h"
//#include "effects.h"
//#include "effects.cpp"

//#include "Fog.h"
#pragma comment (lib,"d3dx9.lib")
#pragma comment (lib,"d3d9.lib")
/////////////////////
//
/////////////////////

#define KEYDOWN(vk_code)  ((GetAsyncKeyState(vk_code) & 0x8000)? 1 : 0)
#define KEYUP(vk_code)    ((GetAsyncKeyState(vk_code) & 0x8000)? 0 : 1)
#define D3DFVF_POINTVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
inline DWORD FtoDW( FLOAT f ) { return *((DWORD*)&f); }



struct CONTROL
{
    D3DXVECTOR3    LookAt[3];
};

struct POINTVERTEX
{
    D3DXVECTOR3 p;
    D3DCOLOR    color;
};

// 定义雪效果的结构
struct SNOW
{
        LPDIRECT3DVERTEXBUFFER9      m_pSnowVB;   
		LPDIRECT3DTEXTURE9      m_pTextureSnow;
		LONG		m_lSnowCount;
        D3DXVECTOR3 m_vPosition;
		DWORD        m_Width;
		DWORD        m_Lenth;
		DWORD        m_Hight;
		float        m_offset;
};

 CONTROL  g_Control;
float   g_Angle = 0;



LPDIRECT3D9				g_pD3D=NULL;//指向D3D接口的指针
LPDIRECT3DDEVICE9 g_pD3DDevice=NULL;//指向D3D设备接口的指针
LPD3DXFONT              g_pFont;//文本框对象,用于显示文字
CMesh *g_pMesh;
Girl  *g_pMeshGirl;
//Flower g_Flower;
SNOW g_Snow;



//-----------------------------------------------------------------------------
// 名称: 3DEn_Snow_Init()
// 功能: 初始化雪
//-----------------------------------------------------------------------------
HRESULT En_Snow_Delete(SNOW *pSnow)
{
    if(pSnow->m_pSnowVB)
	       pSnow->m_pSnowVB->Release();

    if(pSnow->m_pTextureSnow != NULL )
        pSnow->m_pTextureSnow->Release();

	return D3D_OK;

}

HRESULT En_Snow_Init(LPDIRECT3DDEVICE9 pd3dDevice,
					   SNOW *pSnow,	   
					   LONG density)
{
    
	HRESULT hr;
    
	DWORD width = pSnow->m_Width;
	DWORD lenth = pSnow->m_Lenth;
	DWORD hight = pSnow->m_Hight ;

	LONG lSnowCount = width*lenth*density*density;
	pSnow->m_lSnowCount = lSnowCount;
 
	// 创建渲染雪花的纹理
    if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, "Model\\snow.tga",
                                           &pSnow->m_pTextureSnow ) ) )
	{ 
		//MessageBox(NULL,"加载雪花纹理失败!\n可能是文件名或路径错误。",&pSnow,MB_OK|MB_ICONERROR);
        return E_FAIL;
	}
    // 生成雪花的顶点
    hr = pd3dDevice->CreateVertexBuffer( lSnowCount*sizeof(POINTVERTEX),
                                         D3DUSAGE_WRITEONLY, D3DFVF_POINTVERTEX,
                                         D3DPOOL_MANAGED, &pSnow->m_pSnowVB,NULL );
   
	POINTVERTEX* pVertices = NULL;
	LPDIRECT3DVERTEXBUFFER9      pVB = pSnow->m_pSnowVB;

    hr = pVB->Lock( 0, lSnowCount*sizeof(POINTVERTEX),
                             (void**)&pVertices, 0 );

    for( DWORD line = 0; line < (DWORD)(width*density) ; line++ )
    {
		float offwidth = (float)1/density;

        for( DWORD seg=0; seg < (DWORD)(lenth*density); seg++ )
        {
            FLOAT fRandx = ((FLOAT)rand()/(FLOAT)RAND_MAX) *  2.1f;
			FLOAT fRandy = ((FLOAT)rand()/(FLOAT)RAND_MAX) *  10.0f;
	        FLOAT fRandz = ((FLOAT)rand()/(FLOAT)RAND_MAX) *  0.1f;
		    
			float offlenth = (float)1/density;
            pVertices->p.x =  -(float)width/2 + seg * (offwidth + fRandx);
            pVertices->p.y = (float)pSnow->m_Hight + fRandy;
            pVertices->p.z =  -(float)lenth/2 + line *(offlenth + fRandz);
			pVertices->color = 0xffffffff;
            pVertices++;
		}
	}

    pVB->Unlock();

	return S_OK;
}

HRESULT En_Snow_Move( SNOW *pSnow, float offset )
{
    
	HRESULT hr;

	DWORD lSnowCount = pSnow->m_lSnowCount;

    // 移动雪花的顶点
	POINTVERTEX* pVertices = NULL;
	LPDIRECT3DVERTEXBUFFER9      pVB = pSnow->m_pSnowVB;

    hr = pVB->Lock( 0, lSnowCount*sizeof(POINTVERTEX),
                             (void**)&pVertices, 0 );

    for( DWORD seg=0; seg < lSnowCount; seg++ )
    {
        if(pVertices->p.y < 0)
			pVertices->p.y = (float)pSnow->m_Hight;
		else
			pVertices->p.y -= offset;

        pVertices++;
	}



    pVB->Unlock();

	return S_OK;
}


HRESULT En_Snow_Draw( LPDIRECT3DDEVICE9 pd3dDevice, SNOW *pSnow )
{
   	D3DXMATRIX matWorld;
	DWORD lSnowCount = pSnow->m_lSnowCount;

	D3DXMatrixTranslation( &matWorld, g_Control.LookAt[0].x , 35 , g_Control.LookAt[0].z );
	g_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld );

    // 渲染雪花的顶点
	POINTVERTEX* pVertices = NULL;
	LPDIRECT3DVERTEXBUFFER9      pVB = pSnow->m_pSnowVB;

    pd3dDevice->SetTexture( 0, pSnow->m_pTextureSnow );

    pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE );
    pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
    pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
    pd3dDevice->SetRenderState( D3DRS_ALPHAREF,        0x0f);
    pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL );

    pd3dDevice->SetRenderState( D3DRS_POINTSPRITEENABLE, TRUE );
    pd3dDevice->SetRenderState( D3DRS_POINTSCALEENABLE,  TRUE );
    pd3dDevice->SetRenderState( D3DRS_POINTSIZE,     FtoDW(0.04f) );
    pd3dDevice->SetRenderState( D3DRS_POINTSIZE_MIN, FtoDW(0.00f) );
    pd3dDevice->SetRenderState( D3DRS_POINTSCALE_A,  FtoDW(1.00f) );
    pd3dDevice->SetRenderState( D3DRS_POINTSCALE_B,  FtoDW(1.00f) );
    pd3dDevice->SetRenderState( D3DRS_POINTSCALE_C,  FtoDW(1.00f) );

    pd3dDevice->SetFVF( D3DFVF_POINTVERTEX );
    pd3dDevice->SetStreamSource( 0, pVB,0, sizeof(POINTVERTEX) );
    pd3dDevice->DrawPrimitive( D3DPT_POINTLIST,
                                   0, lSnowCount);

	En_Snow_Move(pSnow,0.01f);

	pd3dDevice->SetFVF( D3DFVF_POINTVERTEX );
    pd3dDevice->SetStreamSource( 0, pVB,0, sizeof(POINTVERTEX) );
    pd3dDevice->DrawPrimitive( D3DPT_POINTLIST,
                                   0, lSnowCount);

	pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
    pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );

	En_Snow_Move(pSnow, pSnow->m_offset);

	return S_OK;
}

/////////////////////////
//初始化D3D程序
////////////////////////
HRESULT InitialiseD3D(HWND hWnd)
{

	g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);//创建D3D对象,指针参数唯一
	if(g_pD3D==NULL)
	{
		return E_FAIL;
	}
	D3DDISPLAYMODE d3ddm;//获取显示设备模式
	if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
	{
		return E_FAIL;
	}
	D3DPRESENT_PARAMETERS d3dpp;//创建结构保存设备的显示模式
	ZeroMemory(&d3dpp,sizeof(d3dpp));
	//填充显示结构????????????
	d3dpp.Windowed=true;//窗口模式
    d3dpp.BackBufferCount = 1;
    //d3dpp.BackBufferFormat = d3ddm.Format;
    d3dpp.BackBufferWidth = d3ddm.Width;
    d3dpp.BackBufferHeight = d3ddm.Height;
    d3dpp.hDeviceWindow = hWnd;
    //d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;//翻转的模式
	d3dpp.BackBufferFormat=d3ddm.Format;//后缓冲的显示模式
	d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.EnableAutoDepthStencil = TRUE;  
	//创建D3D设备接口
	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
		      hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
    {
		return E_FAIL;
	}
	g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
g_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);  

	g_pMesh=new CMesh(g_pD3DDevice,"Model\\world\\world.x",false);
	g_pMeshGirl=new Girl(g_pD3DDevice,"asa.x",false);
	


    // 创建雪结构
	g_Snow.m_Hight = 15;
	g_Snow.m_Lenth = 15;
	g_Snow.m_Width = 15;
	g_Snow.m_offset = 0.1f;
	

	En_Snow_Init(g_pD3DDevice,&g_Snow,10);

	g_Control.LookAt[0] = 1*D3DXVECTOR3( 0.0f, 40.0f,0.0f );//摄影机的位置
	g_Control.LookAt[1] = 1*D3DXVECTOR3( 0.0f, 40.0f,1.0f );//摄影机朝向的位置
	g_Control.LookAt[2] = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );//摄影机的正方向
//    g_lightPosition = D3DXVECTOR3( 0.0f, 1.0f,-4.0f );
		                        
							


//实例化LPD3DXFONT文本框对象
	#if(D3D_SDK_VERSION==32)
		D3DXCreateFont(g_pD3DDevice,32,0,0,1,0,ANSI_CHARSET,0,0,0,"Comic Sans MS",&g_pFont);
	#else
		HFONT hFont = CreateFont(32, 0, 1, 0, 0, 1, 0, 0, 
			ANSI_CHARSET, 0, 0, 0, 0, "Comic Sans MS");
		D3DXCreateFont(g_pD3DDevice,hFont,&g_pFont);
	#endif	
    
   
	return S_OK;
}

//-----------------------------------------------------------------------------
// Name: SetFog()
// Desc: 设置雾化效果
//-----------------------------------------------------------------------------
VOID SetFog()
{
	g_pD3DDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
	g_pD3DDevice->SetRenderState( D3DRS_FOGCOLOR,0x00ffffFF);

	D3DCAPS9 stCaps;
	g_pD3DDevice->GetDeviceCaps (&stCaps);
	if (stCaps.RasterCaps&D3DPRASTERCAPS_FOGRANGE)
		g_pD3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE);

    float start=1000;
	float end=4000;
	float density=10.1f;

	g_pD3DDevice->SetRenderState( D3DRS_FOGSTART,*(DWORD*)&start);
			g_pD3DDevice->SetRenderState( D3DRS_FOGEND,*(DWORD*)&end);
			g_pD3DDevice->SetRenderState( D3DRS_FOGTABLEMODE,D3DFOG_LINEAR);
/*
	float fTime=timeGetTime()/1000.0f;
	fTime=fTime/10;
	int FogKey=((int)fTime)%3;

	
	

	switch(FogKey)
	{
		case 0:
			g_pD3DDevice->SetRenderState( D3DRS_FOGSTART,*(DWORD*)&start);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -