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

📄 d3dwnd.cpp

📁 MFC 中创建DX的例子,实现了椭圆的自转,对新手非常有用,同时我也是新手....QQ524052862 加时请著名DX9爱好者
💻 CPP
字号:
// D3DWnd.cpp : 实现文件
//

#include "stdafx.h"
#include "d3d.h"
#include "D3DWnd.h"

struct CUSTOMVERTEX1
{
	D3DXVECTOR3 position;	//坐标
	D3DXVECTOR3 normal;		//顶点法线
};
#define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct CUSTOMVERTEX2
{
	D3DXVECTOR3 position;	//坐标
	D3DXVECTOR3 normal;		//顶点法线
};

#define D3DFVF_CUSTOMVERTEX2 (D3DFVF_XYZ | D3DFVF_DIFFUSE)
// CD3DWnd

IMPLEMENT_DYNAMIC(CD3DWnd, CWnd)

CD3DWnd::CD3DWnd()
{
	m_nRotateY = 0;
	ceshi =1;
		
//	SetTimer(1,40,NULL);
}

CD3DWnd::~CD3DWnd()
{
}
void CD3DWnd::InitD3D()
{
	m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	D3DPRESENT_PARAMETERS dpp;
	ZeroMemory(&dpp,sizeof(dpp));
	dpp.Windowed = true;
	dpp.BackBufferFormat = D3DFMT_UNKNOWN;	//离屏表面格式
	dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;	//离屏表面
	dpp.EnableAutoDepthStencil = true;		//开启Z缓存
	dpp.AutoDepthStencilFormat = D3DFMT_D16;//生成16 bit的Z缓存
	m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
						D3DDEVTYPE_HAL,
						m_hWnd,
						D3DCREATE_SOFTWARE_VERTEXPROCESSING,
						&dpp,&m_pDevice);
	m_pDevice->SetRenderState(D3DRS_LIGHTING,true);			//不使用灯光
	m_pDevice->SetRenderState(D3DRS_NORMALIZENORMALS,true);
//	m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);		//背面可见
	SetTimer(1,40,NULL);
}

BEGIN_MESSAGE_MAP(CD3DWnd, CWnd)
	ON_WM_CREATE()
	ON_WM_PAINT()
	ON_WM_DESTROY()
	ON_WM_TIMER()
END_MESSAGE_MAP()



// CD3DWnd 消息处理程序



int CD3DWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	InitD3D();
	InitGeometry();
	return 0;
}
void CD3DWnd::Render()
{
	
	m_pDevice->Clear(0,NULL,D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);
	m_pDevice->BeginScene();
	setupMartrices();
	setlight();
	setcaizhi1();
	m_pDevice->SetFVF(D3DFVF_CUSTOMVERTEX1);
	m_pDevice->SetStreamSource(0,m_pVB1,0,sizeof(CUSTOMVERTEX1));
	m_pDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 30 );
	//绑定索引缓存区
//	m_pDevice->SetIndices();
//	m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,4);
//	m_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
	setcaizhi2();
	m_pDevice->SetFVF( D3DFVF_CUSTOMVERTEX2 );
	m_pDevice->SetStreamSource( 0, m_pVB2, 0, sizeof(CUSTOMVERTEX2) );
	m_pDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 30 );
	m_pDevice->EndScene();
	m_pDevice->Present(NULL,NULL,NULL,NULL);
	
}
void CD3DWnd::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CWnd::OnPaint()
	//Render();
}

void CD3DWnd::OnDestroy()
{
	CWnd::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	qingchu();
}

void CD3DWnd::qingchu()
{
//	m_pIB1->Release();
	m_pVB1->Release();
	m_pVB2->Release();
	m_pDevice->Release();
	m_pD3D->Release();
}
void CD3DWnd::InitGeometry()
{
	//三角形实体的数学模型
	CUSTOMVERTEX1 vertices1[32];
	vertices1[0].position=D3DXVECTOR3(-1.0f,0.0f,0.0f);
	vertices1[0].normal=D3DXVECTOR3(-1.0f,0.0f,0.0f);
	for(int i=1;i<32;i++)
	{
		float theta=(i-1)*12*D3DX_PI/180;
		vertices1[i].position=D3DXVECTOR3(1.0f,sin(theta),cos(theta));
		vertices1[i].normal=D3DXVECTOR3(0.0f,sin(theta),cos(theta));
	}
	CUSTOMVERTEX2 vertices2[32];
	vertices2[0].normal=D3DXVECTOR3(1.0f,0.0f,0.0f);
	vertices2[0].position=D3DXVECTOR3(1.0f,0.0f,0.0f);
	for (int i=1;i<32;i++)
	{
		vertices2[2].position=vertices1[32-i].position;
		vertices2[2].normal=D3DXVECTOR3(1.0f,0.0f,0.0f);
	}
	
	//创建顶点缓存区,并获取接口
	m_pDevice->CreateVertexBuffer(sizeof(vertices1),0,D3DFVF_CUSTOMVERTEX1,D3DPOOL_DEFAULT,&m_pVB1,NULL);
	//把顶点数据填入顶点缓存区
	void* pVertices1;
	m_pVB1->Lock( 0, sizeof(vertices1), (void**)&pVertices1, 0 );
	memcpy( pVertices1, vertices1, sizeof(vertices1) );
	m_pVB1->Unlock();
	m_pDevice->CreateVertexBuffer(sizeof(vertices2),0,D3DFVF_CUSTOMVERTEX2,D3DPOOL_DEFAULT,&m_pVB2,NULL);
	//把顶点数据填入顶点缓存区
	void* pVertices2;
	m_pVB2->Lock( 0, sizeof(vertices2), (void**)&pVertices2, 0 );
	memcpy( pVertices2, vertices2, sizeof(vertices2) );
	m_pVB2->Unlock();
}
void CD3DWnd::setupMartrices()
{
	float angle = m_nRotateY*D3DX_PI/180;//把旋转角度换算成弧度
	D3DXMATRIX matWorld;//计算世界变换矩阵
	::D3DXMatrixRotationY(&matWorld,angle);
/*	D3DXMATRIX matXWorld;
	::D3DXMatrixRotationX(&matXWorld,angle);
	D3DXMATRIX pi;
	pi = matXWorld*matWorld;*/
	//把世界变换矩阵设置到渲染环境
//	m_pDevice->SetTransform(D3DTS_WORLD,&/*pi*/matWorld);
	m_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
	D3DXVECTOR3 eye(0.0f,3.0f,-5.0f);//观察点
	D3DXVECTOR3 lootat(0.0f,0.0f,0.0f);//视线目标点
	D3DXVECTOR3 up(0.0f,1.0f,0.0f);//上方向
	//计算视角变换矩阵
	D3DXMATRIX matView;
	::D3DXMatrixLookAtLH(&matView,&eye,&lootat,&up);
	//把视角变换矩阵设置到渲染环境
	m_pDevice->SetTransform(D3DTS_VIEW,&matView);

	D3DXMATRIXA16 matProj;
	//计算透视投影变换矩阵
	::D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
	//把投影变换矩阵设置到渲染环境
	m_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);

	
}
void CD3DWnd::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	Render();
	m_nRotateY +=2;
	CWnd::OnTimer(nIDEvent);
}
void CD3DWnd::setlight()
{
	D3DLIGHT9 light;
	::ZeroMemory(&light,sizeof(light));
	light.Type=D3DLIGHT_DIRECTIONAL;
	light.Diffuse.r=1.0f;
	light.Diffuse.g=1.0f;
	light.Diffuse.b=1.0f;
	light.Direction=D3DXVECTOR3(-1.0f,-1.0f,0.0f);
	light.Range = 1000.0f;
	m_pDevice->SetLight(0,&light);
	m_pDevice->LightEnable(0,true);
	m_pDevice->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_RGBA(32,32,32,0));

	
}
void CD3DWnd::setcaizhi1()
{
	//创建一个白色的材质
	D3DMATERIAL9 mtrl;
	::ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
	mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
	mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
	mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
	mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
	m_pDevice->SetMaterial( &mtrl ); //设置材质

}
void CD3DWnd::setcaizhi2()
{
	//创建一个黄色的材质
	D3DMATERIAL9 mtrl;
	::ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
	mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
	mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
	mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
	mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
	m_pDevice->SetMaterial( &mtrl ); //设置材质

}

⌨️ 快捷键说明

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