Direct3D 9 入门例子程序 圆锥体

介绍

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

程序实现

框架

一个对话框继承自CWnd

细节

1. 创建工程D3DMFCApp

2. 添加按钮 开始 结束 到D3DMFCAppDlg 主窗口。

3. 添加类 D3DDlg 到工程 随便找个图片 (jpg我的是)大小改为 256x256 的 命名texture.jpg 复制到工程。

4. D3DMFCAppDlg 添加变量

CD3DDlg m_D3DDlg;

5. D3DMFCAppDlg 开始按钮生成函数添加

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  结束按钮生成函数添加

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();
}

程序结果

总结

Direct3D

这么大的概念谁也没有办法一下子说清楚,只有多练,我写这个程序写了三周,其中一个Bug卡了将近一周。谁解释也是白搭,只有多练,不过推荐的就是抄程序也要抄对。

程序

1>MFC 工程始入门的最好的工程类型,我试过Win32,一个框架就把人搭晕了。不如MFC 干脆,但是MFC 仅限学习,到了应用还是Win32,那时应该好说了。

2>变量是 D3DDevice9  而不是 D3D9Device,当然你可以自己随便编写,不过人家官网是这样,慢慢习惯了好学习。

3>函数调用跟Win32 一个风格,例如

m_pD3DDevice9->CreateVertexBuffer(
	sizeof(vertices1),
	0,
	D3DFVF_CUSTOMVERTEX1,
	D3DPOOL_DEFAULT,
	&m_pVB1,
	NULL);

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

4>图片复制到工程需要修改属性,类型是资源编译器,要不然报什么链接1102的错误。

其他

如果想学习更多参考 DirectX3D9 初级教程 祝晓鹰 余峰写的,我看了特别好,百度好评的时候想给好评的结果给了一个1星就再也改不了了,把我气的,这里致歉一下。

Direct3D 9 入门例子程序 圆锥体

时间: 2024-10-25 08:28:25

Direct3D 9 入门例子程序 圆锥体的相关文章

spring mvc构建WEB应用程序入门例子

在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请求由DispatcherServlet分配给控制器(根据处理器映射),在控制器完成处理后,请求会被发送到一个视图(根据viewController解析逻辑视图) 来呈现输出结果. 整理成下图所示: 2)搭建一个简单的spring mvc例子 ①创建一个maven工程,其中pom中要有spring相关

MINA经典入门例子----Time Server

原文地址 http://blog.sina.com.cn/s/blog_720bdf0501010b8r.html 貌似java的IO.NIO的入门例子都有相关的Time Server Demo.本例为MINA官方Demo翻译过来而已. MINA百科: Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架.当前发行的 MI

JPA入门例子

(1).JPA介绍: JPA全称为Java PersistenceAPI ,Java耐久化API是Sun公司在Java EE 5标准中提出的Java耐久化接口.JPA吸取了当前Java耐久化技能的长处,旨在标准.简化Java目标的耐久化作业.运用JPA耐久化目标,并不是依赖于某一个ORM结构.      为何要运用JAP?      在说为何要运用JPA之前,咱们有必要了解为何要运用ORM技能. ORM 是Object-Relation-Mapping,即目标联系暗射技能,是目标耐久化的中心.O

HTML入门例子

HTML入门例子示例 <1>打开记事本:点击"开始"--选择"程序"--选择"附件"--选择"记事本" <2>输入下面代码(直接拷贝过去就可以啦) <!DOCTYPE html>   <html>        <head>           <title>欢迎来到我的博客</title>       </head> <bo

一个简单的iBatis入门例子

一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import java.util.Date; public class Person { private int id; private String firstName; private String lastName; private double weightInKilograms; private do

给刚入门的程序员五点建议

每个IT企业,尤其是初创企业,非常苦恼:找不到好的程序员.现在大学.软件学院及各种培训机构,每年培养几十万的程序员,毕业的每个人都有同样困恼:找不到好的工作.问题出在哪里呢?其实,企业需要的是不是刚会写程序的人,需要来了就能干活的人,尤其能把活干好的人.而刚毕业的大学生多半刚学会如何写程序,的确很难企业需求. 企业到底需要什么样的程序员,一个刚入门的程序员如何成为企业需要的高手呢?还有很多程序员问我,“我需要具备什么样的能力就可以去创业?”我一直在琢磨类似的问题.我自己写过十年程序,也在金山管理

JPA入门例子(采用JPA的hibernate实现版本) 转

JPA入门例子(采用JPA的hibernate实现版本) jpahibernate数据库jdbcjava框架(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了目前Java持久化技术的优点,旨在规范.简化Java对象的持久化工作.使用JPA持久化对象,并不是依赖于某一个ORM框架. 为什么要使用JAP? 在说为什么要使用JPA之前,我们有必要了解为什么要使用ORM技术. OR

【Bootstrap Demo】入门例子创建

本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快捷的创建一个的简单例子.这个例子只有基本的东西:引入了预编译版的 CSS 和 JavaScript 文件,页面只包含了一个 container 元素. 在Bootstrap的官方网站的下载页面 http://getbootstrap.com/getting-started/#download ,也有

在Ubuntu下构建Bullet以及运行Bullet的例子程序

1.找到Bullet的下载页,地址是:https://code.google.com/p/bullet/downloads/list 2.下载Bullet.找到.tgz格式进行下载.我下载的版本是bullet-2.82-r2704. 3.如果没有安装cmake,那么使用sudo apt-get install cmake进行安装. 4.如果没有安装glut,那么使用sudo apt-get install freeglut3以及sudo apt-get install freeglut3-dev