Direct3D 9 入门样例程序 圆锥体
介绍
Directx3D 9
Directx3D 元素
程序结构
程序解析
叙述
UML
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW9uc2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
程序实现
框架
细节
CD3DDlg m_D3DDlg;
m_D3DDlg.CreateEx(
0,
AfxRegisterWndClass(NULL,NULL,NULL,NULL),
L"D3D Window",
WS_POPUP|WS_CAPTION|WS_VISIBLE,
CRect(100,100,500,500),
this,
0);
6. D3DMFCAppDlg 结束button生成函数加入
m_D3DDlg.DestroyWindow();
7. CD3DDlg 头文件引入文件和定义顶点结构
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <d3d9.h>
#include <d3dx9math.h> typedef struct _CUSTOMVERTEX1
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
float fu;
float fv;
}CUSTOMVERTEX1; #define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) typedef struct _CUSTOMVERTEX2
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
}CUSTOMVERTEX2; #define D3DFVF_CUSTOMVERTEX2 (D3DFVF_XYZ|D3DFVF_NORMAL)
这里也许涉及到安装DirectX 只是网上非常多样例了,我仅仅关注实例练习,仅仅是说假设安装了D3D SDK。那么路径配置正确这样写不会有错误。
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnTimer(UINT_PTR nIDEvent);
9. 类向导加入私有函数
void InitD3D9(void);
void Render(void);
void CleanUp(void);
void InitGeometry(void);
void SetupMatrices(void);
void SetLight(void);
void SetMaterial1(void);
void SetMaterial2(void);
10 .类向导加入私有变量
LPDIRECT3D9 m_pD3D9;
LPDIRECT3DDEVICE9 m_pD3DDevice9;
LPDIRECT3DVERTEXBUFFER9 m_pVB1;
LPDIRECT3DVERTEXBUFFER9 m_pVB2;
LPDIRECT3DTEXTURE9 m_pD3DTexture9;
int m_nRotateY;
11. CD3DDlg实现文件 初始化 D3D
<pre name="code" class="cpp">void CD3DDlg::InitD3D9(void)
{
m_pD3D9=Direct3DCreate9(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS)); d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
d3dpp.BackBufferCount=1;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; m_pD3D9->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
m_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&m_pD3DDevice9); m_pD3DDevice9->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE); m_pD3DDevice9->SetRenderState(D3DRS_LIGHTING,TRUE); m_pD3DDevice9->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
}
12. 初始化图元
void CD3DDlg::InitGeometry(void)
{
D3DXCreateTextureFromFile(m_pD3DDevice9,_T("texture.jpg"),&m_pD3DTexture9); CUSTOMVERTEX1 vertices1[32]; vertices1[0].position=D3DXVECTOR3(-1.0f,0.0f,0.0f);
vertices1[0].normal=D3DXVECTOR3(-1.0f,0.0f,0.0f);
vertices1[0].fu=0.0f;
vertices1[0].fv=0.5f; for (int i=1;i<32;i++)
{
float theat=(i-1)*2*D3DX_PI/30.0f;
vertices1[i].position=D3DXVECTOR3(1.0f,sinf(theat),cosf(theat));
vertices1[i].normal=D3DXVECTOR3(0.0f,sinf(theat),cosf(theat));
float m=sqrtf(5.0f);
float beta=(0.5f-1.0f/m+(i-1.0f)/15.0f/m)*D3DX_PI;
vertices1[i].fu=0.5*sinf(beta);
vertices1[i].fv=0.5-0.5*cosf(beta);
} m_pD3DDevice9->CreateVertexBuffer(
sizeof(vertices1),
0,
D3DFVF_CUSTOMVERTEX1,
D3DPOOL_DEFAULT,
&m_pVB1,
NULL); VOID* pVertices=NULL; m_pVB1->Lock(
0,
sizeof(vertices1),
&pVertices,
0); memcpy(pVertices,vertices1,sizeof(vertices1)); m_pVB1->Unlock(); CUSTOMVERTEX2 vertices2[32]; vertices2[0].position=D3DXVECTOR3(1.0f,0.0f,0.0f);
vertices2[0].normal=D3DXVECTOR3(1.0f,0.0f,0.0f); for (int i=1;i<32;i++)
{
float theat=(i-1)*2*D3DX_PI/30.0f;
vertices2[i].position=vertices1[32-i].position;
vertices2[i].normal=D3DXVECTOR3(1.0f,0.0f,0.0f);
} m_pD3DDevice9->CreateVertexBuffer(
sizeof(vertices2),
0,
D3DFVF_CUSTOMVERTEX2,
D3DPOOL_DEFAULT,
&m_pVB2,
NULL); m_pVB2->Lock(
0,
sizeof(vertices2),
&pVertices,
0); memcpy(pVertices,vertices2,sizeof(vertices2)); m_pVB2->Unlock();
}
13. 设置左边变换
void CD3DDlg::SetupMatrices(void)
{
D3DXMATRIX matWorld;
float angle=m_nRotateY*D3DX_PI/180; D3DXMatrixRotationY(&matWorld,angle );
m_pD3DDevice9->SetTransform(D3DTS_WORLD,&matWorld); D3DXVECTOR3 eye(0.0f,3.0f,-5.0f);
D3DXVECTOR3 lookAt(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMATRIX matView; D3DXMatrixLookAtLH(&matView,&eye,&lookAt,&up); m_pD3DDevice9->SetTransform(D3DTS_VIEW,&matView); D3DXMATRIXA16 matProj; D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f); m_pD3DDevice9->SetTransform(D3DTS_PROJECTION,&matProj);
}
14. 设置材料1
void CD3DDlg::SetMaterial1(void)
{
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_pD3DDevice9->SetMaterial(&mtrl);
}
15. 设置材料2
void CD3DDlg::SetMaterial2(void)
{
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_pD3DDevice9->SetMaterial(&mtrl);
}
16.设置关照
void CD3DDlg::SetLight(void)
{
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(0.0f,0.0,1.0f);
light.Range=1000.0f; m_pD3DDevice9->SetLight(0,&light); m_pD3DDevice9->LightEnable(0,TRUE); m_pD3DDevice9->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_RGBA(32,32,32,0));
}
17. 渲染 运行
void CD3DDlg::Render(void)
{
m_pD3DDevice9->Clear(
0,
NULL,
D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,255),
1.0f,
0); m_pD3DDevice9->BeginScene(); SetupMatrices(); SetLight(); SetMaterial1(); m_pD3DDevice9->SetTexture(0,m_pD3DTexture9); m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE); m_pD3DDevice9->SetFVF(D3DFVF_CUSTOMVERTEX1); m_pD3DDevice9->SetStreamSource(0,m_pVB1,0,sizeof(CUSTOMVERTEX1)); m_pD3DDevice9->DrawPrimitive(D3DPT_TRIANGLEFAN,0,30); m_pD3DDevice9->SetTexture(0,NULL); m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DISABLE); SetMaterial2(); m_pD3DDevice9->SetFVF(D3DFVF_CUSTOMVERTEX2); m_pD3DDevice9->SetStreamSource(0,m_pVB2,0,sizeof(CUSTOMVERTEX2)); m_pD3DDevice9->DrawPrimitive(D3DPT_TRIANGLEFAN,0,30); m_pD3DDevice9->EndScene(); m_pD3DDevice9->Present(NULL,NULL,NULL,NULL);
}
18. 释放资源
void CD3DDlg::CleanUp(void)
{
m_pVB1->Release();
m_pVB2->Release();
m_pD3DTexture9->Release();
m_pD3DDevice9->Release();
m_pD3D9->Release();
}
19. 最终该公有函数了 初始化
int CD3DDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1; InitD3D9(); InitGeometry(); SetTimer(1,40,NULL); return 0;
}
20. 定时运行渲染
void CD3DDlg::OnTimer(UINT_PTR nIDEvent)
{
Render(); m_nRotateY+=2; CWnd::OnTimer(nIDEvent);
}
21. 结束
void CD3DDlg::OnDestroy()
{
CWnd::OnDestroy(); CleanUp();
}
程序结果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW9uc2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW9uc2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
总结
Direct3D
谁解释也是白搭,仅仅有多练。只是推荐的就是抄程序也要抄对。
程序
m_pD3DDevice9->CreateVertexBuffer(
sizeof(vertices1),
0,
D3DFVF_CUSTOMVERTEX1,
D3DPOOL_DEFAULT,
&m_pVB1,
NULL);
每个參数一行,至于什么函数分行写还是须要自己把握的。微软内部调用时第一个參数和函数同行。最后一个括号会再分一行,我认为不好就调成这种格式了。
其它
Direct3D 9 入门样例程序 圆锥体的更多相关文章
- 在Ubuntu下构建Bullet以及执行Bullet的样例程序
		
在Ubuntu下构建Bullet以及执行Bullet的样例程序 1.找到Bullet的下载页,地址是:https://code.google.com/p/bullet/downloads/list 2 ...
 - SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)
		
做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...
 - Tuxedo安装、配置、以及演示样例程序 (学习网址)
		
Tuxedo安装.配置.以及演示样例程序 (学习网址): 1.http://liu9403.iteye.com/blog/1415684 2.http://www.cnblogs.com/fnng/a ...
 - Java读取Excel文件(包括xls和xlsx)的样例程序
		
样例程序如下所示,其中: parseXls()函数依赖于jxl,只能读取xls格式文件: parseExcel()函数依赖于apache poi,能够读取xls和xlsx两种格式的文件. jxl的依赖 ...
 - Spring Boot入门样例-001-Java和Maven安装配置
		
Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...
 - jbpm入门样例
		
1. jBPM的简介 jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储. 參考 http://www.jbos ...
 - 图解VC++ opengl环境配置和几个入门样例
		
VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu. ...
 - JPA入门样例(採用JPA的hibernate实现版本号)
		
(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了眼下Java持久化技术的长 ...
 - Python Socket 编程——聊天室演示样例程序
		
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...
 
随机推荐
- lua-helloworld
			
write script file, a.lua: #!/usr/bin/lua print("hello world!") add excutable prperty to th ...
 - 九度oj 题目1024:畅通工程
			
题目描述: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道 ...
 - cell左右滑动展开更多按钮-MGSwipeTableCell
			
MGSwipeTableCell是一个UITableViewCell的子类, 它实现了左,右滑动展开更多按钮用来实现一些相关操作就和QQ好友列表滑动展开的按钮一样,封装的很好,动画效果也处理很到位,废 ...
 - BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡 ——广义后缀自动机
			
神奇的性质,叶子节点不超过20个. 然后把这些节点提出来构成一颗新树,那么这些树恰好包含了所有的情况. 所以直接广义后缀自动机. 然后统计本质不同的字符串就很简单显然了. #include <c ...
 - BZOJ3611 [Heoi2014]大工程  【虚树】
			
题目 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a ...
 - BZOJ1922 [Sdoi2010]大陆争霸  【最短路】
			
题目 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林 ...
 - Mybatis 如何自动生成bean dao xml 配置文件 generatorconfig.xml (main()方法自动生成更快捷)
			
最近项目要用到mybatis中间件,中间涉及到要对表结构生成bean,dao,和sqlconfig.xml 所以记录一下学习过程 首先是准备工作,即准备需要的jar包:我们的数据库mysql,所以驱动 ...
 - Linux(6):定时任务
			
定时任务 定时任务的说明和分类 # 定时任务分类: 1. crond(crontab) 定时任务软件(软件包 cronie) 2. atd 运行一次 3. anacron 非7*24小时运行的服务器 ...
 - N皇后-位运算优化
			
N皇后问题 时间限制: 5 Sec 内存限制: 128 MB 题目描述 魔法世界历史上曾经出现过一个伟大的罗马共和时期,出于权力平衡的目的,当时的政治理论家波利比奥斯指出:“事涉每个人的权利,绝不应 ...
 - 联合权值(codevs 3728)
			
Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v ...