📄 d3dwnd.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 + -