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 ...
随机推荐
- x86保护模式 控制寄存器和系统地址寄存器
控制寄存器和系统地址寄存器 控制寄存器 crx cr0 指示cpu工作方式的控制位 包含启用和禁止分页管理机制的控制位 包含控制浮点协处理器操作的控制位 注意必须为0的位 cr2和c ...
- 九度oj 题目1207:质因数的个数
题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...
- 刷题总结——营业额统计(bzoj1588)
题目: Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成 ...
- 【2018.11.23】2018WCTest(8)
T1 小 $X$ 无敌就是指他的防御 $\ge$ 怪物的攻击 $n$.另外小 $X$ 最多只需要把攻击加到怪物的防御 $k$,此时已经能一招秒一个,再多加必定无用且需承受更多伤害. $20$ 分 $d ...
- 【2018.8.10】四连测day4 题解
T1:给出一棵 $n$ 个节点的无根树,其中 $m$ 个节点是特殊节点,求对于任意 $i ∈ [0, m]$,包含 $i$ 个特殊节点的联通块个数$\mod 998244353$. $1<=n, ...
- 洛谷 [P1939] 矩阵加速数列
矩阵快速幂模版 #include <iostream> #include <cstring> #include <cstdlib> #include <alg ...
- ElasticSearch中辅助API常用用法详解
本篇是使用Elasticsearch必不可少的必备知识,并且适用于所有的Rest Api. 返回数据格式化 当在Rest请求后面添加?pretty时,结果会以Json格式化的方式显示.另外,如果添加? ...
- [MFC] TabControl选项卡的使用
MFC中,因项目需要使用TabControl ,使用过程中发现,MFC中的TabControl与C#的TabControl不同,不能通过属性来创建选项页,只能代码生成绑定. 以下为具体的实现方法步骤: ...
- HDU 4474 Yet Another Multiple Problem【2012成都regional K题】 【BFS+一个判断技巧】
Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- 重写enum的valueof方法等
enum 对象的常用方法介绍 int compareTo(E o) 比较此枚举与指定对象的顺序. Class<E> getDeclaringClass() ...