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

📄 mirror.cpp

📁 MIRROR001程序是关于ALPHA混合透明的应用
💻 CPP
字号:
#if !defined (parm)
#define  parm
#include<windows.h>
#include<d3dx9.h>
#endif
#include<mmsystem.h>
#include"MyFont.h"
#include"stdio.h"

//================
LPDIRECT3D9           g_pD3D=NULL;
LPDIRECT3DDEVICE9     g_pDevice=NULL;
LPDIRECT3DVERTEXBUFFER9        g_pMirror=NULL;
LPDIRECT3DTEXTURE9             g_pMirrortex=NULL;
LPDIRECT3DTEXTURE9             g_pWalltex=NULL;
LPD3DXMESH                     g_pTeapotmesh=NULL;
LPD3DXMESH                     g_pSpheremesh=NULL;
LPDIRECT3DVERTEXBUFFER9        g_pMyTexture=NULL;
LPDIRECT3DTEXTURE9             g_pMytex=NULL;
struct  MIRROR
{
	float  x,y,z;
	float  nx,ny,nz;
	float  tu,tv;
#define  D3DFVF_MIRROR   (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)
};
CMyFont              *g_pFont=NULL;
CMyFont              *g_pHelp=NULL;
DWORD                g_StartTime=0;
DWORD                g_Frames=0;
 
//================
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\=============
HRESULT  InitD3D(HWND hwnd)
{
	if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION) ) )
		return E_FAIL;
	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;

	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pDevice) ) )
		return E_FAIL;

	g_pDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
	g_pDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
	g_pDevice->SetRenderState(D3DRS_ZENABLE,true);
    // 初始化字体
	g_pFont=new CMyFont(g_pDevice,"宋体",15,true,true,false);
	g_pHelp=new CMyFont(g_pDevice,"隶书",15,true,true,false);
	return S_OK;
}
//================================

HRESULT  DrawMirror()
{
	MIRROR   vertices[]=
	{
		// The First rectangle
		{-1.0f,0.5f,0.0f,0.0f,0.0f,1.0f,     0.0f,0.0f},
		{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f,      1.0f,0.0f},
		{-1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,    1.0f,1.0f},
		{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,     0.0f,1.0f},
		//the second  rectangle
		{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f,       0.0f,0.0f},
		{1.0f,0.5f,0.0f,0.0f,0.0f,1.0f,      1.0f,0.0f},
		{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,     1.0f,1.0f},
		{1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,     0.0f,1.0f}
	};
	g_pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
	g_pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
	g_pDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);
	void *pVertices;
	if(FAILED(g_pDevice->CreateVertexBuffer(sizeof(vertices),0,
		D3DFVF_MIRROR,D3DPOOL_DEFAULT,
		&g_pMirror,NULL) ) )
		return E_FAIL;
	g_pMirror->Lock(0,sizeof(vertices),(void * *)&pVertices,0);
	memcpy(pVertices,vertices,sizeof(vertices) );
	g_pMirror->Unlock();
	// Set Transform
	D3DXMATRIX  matWorld;
	D3DXMatrixScaling(&matWorld,1.0f,1.0f,1.0f);
	g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
	D3DXMATRIX  matProj;
	D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
	g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);

	// Set Material
	D3DMATERIAL9       mtr;
	ZeroMemory(&mtr,sizeof(mtr) );
	mtr.Diffuse.r=mtr.Ambient.r=1.0f;
	mtr.Diffuse.g=mtr.Ambient.g=1.0f;
	mtr.Diffuse.b=mtr.Ambient.b=1.0f;
	mtr.Diffuse.a=mtr.Ambient.a=0.5f;//set alpha to 50%
	g_pDevice->SetMaterial(&mtr);
	// Draw Objects	
	g_pDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
	g_pDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);

	g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);

	g_pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
	g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
	
	g_pDevice->SetFVF(D3DFVF_MIRROR);
	g_pDevice->SetStreamSource(0,g_pMirror,0,sizeof(MIRROR) );
	//Draw mirror plane

	if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"mirror.jpg",&g_pMirrortex)) )
	{
		if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"..//mirror.jpg",&g_pMirrortex)) )
		{
			return E_FAIL;
		}
	}
	g_pDevice->SetTexture(0,g_pMirrortex);	
	g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
	g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
	g_pDevice->SetTexture(0,NULL);
	g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
	//Draw the wall plane
	
	if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"wall.jpg",&g_pWalltex)) )
	{
		if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"..//wall.jpg",&g_pWalltex)) )
		{
			return E_FAIL;
		}
	}
	g_pDevice->SetTexture(0,g_pWalltex);
	g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
	g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,2);
	g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
    g_pDevice->SetTexture(0,NULL);
	g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);

	return S_OK;	    
}
//===============================
HRESULT   DrawTeapot()
{
	// Create Teapot From D3DX function
	D3DXCreateTeapot(g_pDevice,&g_pTeapotmesh,0);
	//Set transform
	D3DXMATRIX   matWorld;
	D3DXMatrixTranslation(&matWorld,-1.0f,0.0f,2.0f);
	g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
	D3DXMATRIX  matProj;
	D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
	g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);

	// Set Material
	D3DMATERIAL9       mtr;
	ZeroMemory(&mtr,sizeof(mtr) );
	mtr.Diffuse.r=mtr.Ambient.r=0.2f;
	mtr.Diffuse.g=mtr.Ambient.g=0.2f;
	mtr.Diffuse.b=mtr.Ambient.b=1.0f;
	mtr.Diffuse.a=mtr.Ambient.a=0.5f;

	g_pDevice->SetMaterial(&mtr);
	// Draw Teapot
	
	g_pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
	if(::GetAsyncKeyState('O'))
		g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
	if(::GetAsyncKeyState('I'))	
		g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
	if(::GetAsyncKeyState('A'))	
		g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_DESTALPHA);
	if(::GetAsyncKeyState('C'))	
		g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
	if(::GetAsyncKeyState('D'))	
		g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_DESTCOLOR);

	g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
	g_pTeapotmesh->DrawSubset(0);
	g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
	return S_OK;
}
//================================
HRESULT  DrawSphere()
{
	D3DXCreateSphere(g_pDevice,1,30,30,&g_pSpheremesh,0);

	D3DXMATRIX   matWorld;
	
	D3DXMatrixTranslation(&matWorld,-1.0f,0.0f,-2.0f);
	g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
	D3DXMATRIX  matProj;
	D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
	g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);

	// Set Material
	D3DMATERIAL9       mtr;
	ZeroMemory(&mtr,sizeof(mtr) );
	mtr.Diffuse.r=mtr.Ambient.r=1.0f;
	mtr.Diffuse.g=mtr.Ambient.g=0.0f;
	mtr.Diffuse.b=mtr.Ambient.b=1.0f;
	mtr.Diffuse.a=mtr.Ambient.a=0.5f;
	mtr.Specular.r=mtr.Specular.g=mtr.Specular.b=0.5f;
	mtr.Power=50;

	g_pDevice->SetMaterial(&mtr);
	g_pSpheremesh->DrawSubset(0);
	return S_OK;
}
//\\\\\\\=========================
void DrawMyText( )
{
	char buffer[255];
	DWORD g_Duration=(timeGetTime()-g_StartTime)/1000;
	if(g_Duration>0)
	{
		DWORD g_FramesFPS=g_Frames/g_Duration;
		sprintf(buffer,"Duration:%d Seconds,Frames:%d ,FPS:%d",g_Duration,
			g_Frames,g_FramesFPS);
	}
	else
	{
		sprintf(buffer,"Calculating...");
	}
	g_pFont->DrawText(buffer,0,0,0xffff00ff);
}
//===================================
void DrawHelp()
{
	char help[255];
	sprintf(help,"Press Key 'O','I','D','C',OR 'A',for different results");
	g_pHelp->DrawText(help,10,50,0xff00ff00);
}
//
///\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\==
HRESULT   DrawMyTexture()
{
	MIRROR  vertices[]=
	{	// The First rectangle
		{-1.0f,0.5f,0.0f,0.0f,0.0f,1.0f,     0.0f,0.0f},
		{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f,      3.0f,0.0f},
		{-1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,    3.0f,3.0f},
		{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,     0.0f,3.0f},
		//the second  rectangle
		{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f,      0.0f,0.0f},
		{1.0f,0.5f,0.0f,0.0f,0.0f,1.0f,      3.0f,0.0f},
		{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,     3.0f,3.0f},
		{1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f,     0.0f,3.0f}
	};
	void *pVertices;
	g_pDevice->CreateVertexBuffer(sizeof(vertices),0,D3DFVF_MIRROR,D3DPOOL_DEFAULT,
		&g_pMyTexture,NULL);
	g_pMyTexture->Lock(0,sizeof(vertices),(void **)&pVertices,0);
	memcpy(pVertices,vertices,sizeof(vertices) );
	g_pMyTexture->Unlock();
	// Set Transform
	D3DXMATRIX  matWorld;
	D3DXMatrixScaling(&matWorld,1.0f,1.0f,1.0f);
	g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
	D3DXMATRIX  matProj;
	D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
	g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);
	
	// Set Material
	D3DMATERIAL9       mtr;
	ZeroMemory(&mtr,sizeof(mtr) );
	mtr.Diffuse.r=mtr.Ambient.r=1.0f;
	mtr.Diffuse.g=mtr.Ambient.g=1.0f;
	mtr.Diffuse.b=mtr.Ambient.b=1.0f;
	mtr.Diffuse.a=mtr.Ambient.a=0.5f;//set alpha to 50%
	g_pDevice->SetMaterial(&mtr);
	g_pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
	g_pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
	g_pDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);
	g_pDevice->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
	g_pDevice->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);
//	g_pDevice->SetSamplerState(0,D3DSAMP_BORDERCOLOR,0Xff00ff00);
	if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"wall.jpg",&g_pMytex)) )
	{
		if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"..//wall.jpg",&g_pMytex)) )
		{
			return E_FAIL;
		}
	}    
	g_pDevice->SetTexture(0,g_pMytex);
	g_pDevice->SetStreamSource(0,g_pMyTexture,0,sizeof(MIRROR) ) ;
	g_pDevice->SetFVF(D3DFVF_MIRROR);
	g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
	g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
	g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
	g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,2);
	g_pDevice->SetTexture(0,NULL);
	return S_OK;
}

//=================================
void Cleanup()
{
	if(g_pMytex)
	{
		g_pMytex->Release();
		g_pMytex=NULL;
	}
	if(g_pMyTexture!=NULL)
	{
		g_pMyTexture->Release();
		g_pMyTexture=NULL;
	}
	if(g_pHelp!=NULL)
	{
		delete g_pHelp;
		g_pHelp=NULL;
	}
	if(g_pFont!=NULL)
	{
		delete g_pFont;
		g_pFont=NULL;
	}
	if(g_pSpheremesh!=NULL)
	{
		g_pSpheremesh->Release();
		g_pSpheremesh=NULL;
	}
	if(g_pTeapotmesh!=NULL)
	{
		g_pTeapotmesh->Release();
		g_pTeapotmesh=NULL;
	}
	if(g_pMirrortex!=NULL)
	{
		g_pMirrortex->Release();
		g_pMirrortex=NULL;
	}	
	if(g_pWalltex!=NULL)
	{
		g_pWalltex->Release();
		g_pWalltex=NULL;
	}
	if(g_pMirror!=NULL)
	{
		g_pMirror->Release();
		g_pMirror=NULL;
	}
	if(g_pDevice!=NULL)
	{
		g_pDevice->Release();
		g_pDevice=NULL;
	}
	if(g_pD3D!=NULL)
	{
		g_pD3D->Release();
		g_pD3D=NULL;
	}

}
//================================
void SetLight()
{
	D3DLIGHT9       light;
    ZeroMemory( &light,sizeof(light) );
	
	light.Type= D3DLIGHT_DIRECTIONAL;
	light.Diffuse.r=0.0f;
	light.Diffuse.g=0.0f;
	light.Diffuse.b=1.0f;
	light.Ambient.r=light.Ambient.g=light.Ambient.b=0.5f;
	light.Diffuse.a=light.Ambient.a=1.0f;
	light.Specular.r=light.Specular.g=light.Specular.b=1.0f;
	D3DXVECTOR3 vecDir;

//	vecDir = D3DXVECTOR3(0.0f,0.0f,-1.0f);
	float  rotate=float((timeGetTime()/50)%360);
	vecDir = D3DXVECTOR3(float(sin(rotate)),0.0f,float(cos(rotate)));
    D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
    light.Range       = 1000.0f;
	g_pDevice->SetRenderState(D3DRS_SPECULARENABLE,TRUE);
	g_pDevice->LightEnable(0,true);
	g_pDevice->SetLight(0,&light);
}
//================================
void SetCamera()
{
	D3DXMATRIX    matView;	
	int x=(timeGetTime()/20)%360;
	float eye_x=float(10.0f*sin(x*D3DX_PI/180));
	float eye_z=float(10.0f*cos(x*D3DX_PI/180));
  
	D3DXVECTOR3   eye(eye_x,0.0f,
		eye_z); 
	D3DXVECTOR3   lookat(0.0f,0.0f,0.0f);
	D3DXVECTOR3   up(0.0f,1.0f,0.0f);
	D3DXMatrixLookAtLH(&matView,&eye,&lookat,&up);
	g_pDevice->SetTransform(D3DTS_VIEW,&matView);
}
//================================
void Render()
{
	g_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xff000000,1.0f,0);

	if(SUCCEEDED(g_pDevice->BeginScene() ) )
		{
			//===========================
		    SetLight();
			SetCamera();

			g_pDevice->SetRenderState(D3DRS_LASTPIXEL,false);
			//			DrawMyTexture();
			DrawSphere();
			DrawTeapot();
			//			DrawMirror();
			DrawMyText();
			DrawHelp();
			
		//===============================
			g_pDevice->EndScene();
		}
	g_Frames++;
	g_pDevice->Present(NULL,NULL,NULL,NULL);
}
//========================================
LRESULT  WINAPI  WinProc(HWND hwnd,UINT msg,WPARAM w,LPARAM l)
{
	switch(msg)
	{
	case WM_DESTROY:	
		Cleanup();
		PostQuitMessage(0);		
		return 0;
	case WM_CREATE:
		return 0;
	}
	return (DefWindowProc(hwnd,msg,w,l));
}



//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------


INT  WINAPI     WinMain(HINSTANCE  hInstance,HINSTANCE hprev,LPSTR lpcm,int mshow)
{
	WNDCLASSEX   wc;
	wc.cbSize=sizeof(WNDCLASSEX);
	wc.style=CS_CLASSDC;
	wc.lpfnWndProc=WinProc;
	wc.cbClsExtra=0;
	wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hIcon=NULL;
	wc.hCursor=NULL;
	wc.hbrBackground=NULL;
	wc.lpszMenuName=NULL;
	wc.lpszClassName="MY MIRROR";
	wc.hIconSm=NULL;

	RegisterClassEx(&wc);
	HWND  hwnd=CreateWindowEx(WS_EX_TOPMOST,"MY MIRROR","MY PROGRAM",WS_OVERLAPPEDWINDOW,
		0,0,500,500,NULL,NULL,wc.hInstance,NULL);
	if(hwnd==0)
		return 0;
	if(SUCCEEDED(InitD3D(hwnd) ) )
	{
		ShowWindow(hwnd,mshow);
		UpdateWindow(hwnd);
		MSG   msg;
		ZeroMemory(&msg,sizeof(msg) );
		g_StartTime=timeGetTime();// obtain starting time
		while(msg.message!=WM_QUIT)
		{
			if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
			{
				Render();
			}
		}
	}
	UnregisterClass("MY MIRROR",wc.hInstance);	
	return 0;
}
		

⌨️ 快捷键说明

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