Direct3D 9 入门例子程序 圆锥体

2023-11-01 20:41

本文主要是介绍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 入门例子程序 圆锥体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/shiyongfu19890308/article/details/37730131
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/325614

相关文章

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序