介绍

Directx3D 9

什么是DirectX,非常好说了,Win32 C++ API。主要是多媒体编程方面的,长处体如今高性能了,如今我知道的版本号最高是D3D11,可是我是学习入门的,从D3D9開始,不算非常是落伍。

Directx3D 元素

D3D元素非常多,这里说的元素是程序中用到的元素。
1〉D3D 编程的起点。能够理解成出所用的D3D SDK程序集。

2〉D3D present parameter 。呈现參数,专业的參数是通过一顿检測配置成最好的。程序中的參数简单的用默认的显示參数。

3〉D3D Device 设备 这个能够理解成多媒体设备的虚拟,在D3D理论中各种概念。

4〉D3D Vertex 顶点 一个图形中有意义的三维顶点,比較特殊一点的地方,比如,三角形顶点。
5〉D3D Vertex Buffer 顶点缓存。临时存放顶点的内存区域。

程序结构

MFC 基于对话框的程序。MFC非常好理解。一个东西摆在哪儿。遇见什么事件就干事件相相应的事情。

程序解析

叙述

初始化
1〉初始化D3D
2〉初始化逻辑单位
配置
1〉配置D3D
2〉配置逻辑
运行
1〉旋转
2〉呈现
结束
1〉释放各种对象

UML

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW9uc2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

程序实现

框架

一个对话框继承自CWnd

细节

1. 创建projectD3DMFCApp
2. 加入button 開始 结束 到D3DMFCAppDlg 主窗体。
3. 加入类 D3DDlg 到project 随便找个图片 (jpg我的是)大小改为 256x256 的 命名texture.jpg 拷贝到project。

4. D3DMFCAppDlg 加入变量
CD3DDlg m_D3DDlg;
5. D3DMFCAppDlg 開始button生成函数加入
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。那么路径配置正确这样写不会有错误。

8. 类向导加入消息函数  记得是类向导 我这个是加入后的结果。
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

这么大的概念谁也没有办法一下子说清楚,仅仅有多练。我写这个程序写了三周。当中一个Bug卡了将近一周。

谁解释也是白搭,仅仅有多练。只是推荐的就是抄程序也要抄对。

程序

1>MFC project始入门的最好的project类型,我试过Win32。一个框架就把人搭晕了。不如MFC 干脆,可是MFC 仅限学习,到了应用还是Win32,那时应该好说了。
2>变量是 D3DDevice9  而不是 D3D9Device,当然你能够自己随便编写,只是人家官网是这样,慢慢习惯了好学习。
3>函数调用跟Win32 一个风格,比如
m_pD3DDevice9->CreateVertexBuffer(
sizeof(vertices1),
0,
D3DFVF_CUSTOMVERTEX1,
D3DPOOL_DEFAULT,
&m_pVB1,
NULL);

每个參数一行,至于什么函数分行写还是须要自己把握的。微软内部调用时第一个參数和函数同行。最后一个括号会再分一行,我认为不好就调成这种格式了。

4>图片拷贝到project须要改动属性,类型是资源编译器,要不然报什么链接1102的错误。

其它

假设想学习很多其它參考 DirectX3D9 0基础教程 祝晓鹰 余峰写的。我看了特别好,百度好评的时候想给好评的结果给了一个1星就再也改不了了。把我气的,这里致歉一下。


Direct3D 9 入门样例程序 圆锥体的更多相关文章

  1. 在Ubuntu下构建Bullet以及执行Bullet的样例程序

    在Ubuntu下构建Bullet以及执行Bullet的样例程序 1.找到Bullet的下载页,地址是:https://code.google.com/p/bullet/downloads/list 2 ...

  2. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  3. Tuxedo安装、配置、以及演示样例程序 (学习网址)

    Tuxedo安装.配置.以及演示样例程序 (学习网址): 1.http://liu9403.iteye.com/blog/1415684 2.http://www.cnblogs.com/fnng/a ...

  4. Java读取Excel文件(包括xls和xlsx)的样例程序

    样例程序如下所示,其中: parseXls()函数依赖于jxl,只能读取xls格式文件: parseExcel()函数依赖于apache poi,能够读取xls和xlsx两种格式的文件. jxl的依赖 ...

  5. Spring Boot入门样例-001-Java和Maven安装配置

    Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...

  6. jbpm入门样例

    1.      jBPM的简介 jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储.    參考 http://www.jbos ...

  7. 图解VC++ opengl环境配置和几个入门样例

    VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu. ...

  8. JPA入门样例(採用JPA的hibernate实现版本号)

    (1).JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了眼下Java持久化技术的长 ...

  9. Python Socket 编程——聊天室演示样例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...

随机推荐

  1. x86保护模式 控制寄存器和系统地址寄存器

    控制寄存器和系统地址寄存器 控制寄存器    crx cr0   指示cpu工作方式的控制位  包含启用和禁止分页管理机制的控制位  包含控制浮点协处理器操作的控制位   注意必须为0的位 cr2和c ...

  2. 九度oj 题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  3. 刷题总结——营业额统计(bzoj1588)

    题目: Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成 ...

  4. 【2018.11.23】2018WCTest(8)

    T1 小 $X$ 无敌就是指他的防御 $\ge$ 怪物的攻击 $n$.另外小 $X$ 最多只需要把攻击加到怪物的防御 $k$,此时已经能一招秒一个,再多加必定无用且需承受更多伤害. $20$ 分 $d ...

  5. 【2018.8.10】四连测day4 题解

    T1:给出一棵 $n$ 个节点的无根树,其中 $m$ 个节点是特殊节点,求对于任意 $i ∈ [0, m]$,包含 $i$ 个特殊节点的联通块个数$\mod 998244353$. $1<=n, ...

  6. 洛谷 [P1939] 矩阵加速数列

    矩阵快速幂模版 #include <iostream> #include <cstring> #include <cstdlib> #include <alg ...

  7. ElasticSearch中辅助API常用用法详解

    本篇是使用Elasticsearch必不可少的必备知识,并且适用于所有的Rest Api. 返回数据格式化 当在Rest请求后面添加?pretty时,结果会以Json格式化的方式显示.另外,如果添加? ...

  8. [MFC] TabControl选项卡的使用

    MFC中,因项目需要使用TabControl ,使用过程中发现,MFC中的TabControl与C#的TabControl不同,不能通过属性来创建选项页,只能代码生成绑定. 以下为具体的实现方法步骤: ...

  9. 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 ...

  10. 重写enum的valueof方法等

    enum 对象的常用方法介绍 int compareTo(E o)           比较此枚举与指定对象的顺序. Class<E> getDeclaringClass()        ...