Direct-X学习笔记--X模型导入

Direct-X学习笔记--Direct-X的基本知识 一.Direct-X简介 说是Direct-X,其实最主要的还是Direct3D,绘制3D世界的利器。拥有通过HAL(硬件抽象层)直接访问硬件的能力,比GDI/GDI+的效率高得不是一点半点。 开始的时候是想学个游戏引擎的,比如特别火的unity3D,后来一想,还是懂一点底层的东西比较好。于是就选择了D3D。引擎的话应该就是写好的一种框架罢了,还是要基于D3D或者OpenGL等图形AP 阅读详情

一.介绍

经历了之前手写立方体的痛苦过程,终于到了网格模型这一步。我们做游戏的时候肯定不能只用立方体呀,想要复杂的人物模型肯定是需要美工同学们使用专业的工具才能创建出来的,这些模型文件中定义好了网格模型的形状以及材质纹理等信息,我们所要做的只是读取这个文件,然后就可以根据文件中的信息创建复杂的模型啦!然而说白了,这些东东DX已经为我们定义好了,我们背一背API就行啦!

创建这些模型一般用3DMAX或者Maya软件,然而我作为一个程序都写不太明白的人,并不需要过多的了解这个东东,只需要知道它导出的格式就好啦。通常建模软件导出的格式为3ds,.max, .obj,.mb等,而.X为DX自带的一种格式,我们在学习阶段使用.X文件足够了。至于其他的,只是换了个识别的工具罢了,功能都是一样的。还是老套路,背API。

我们使用.X文件时,一般都是.X文件配上若干张图片,.X文件中记录了这些纹理怎么用,这个我们不需要关心。


二.过程

1.根据.X文件名读取并创建Mesh:

该函数原型如下:

HRESULT  D3DXLoadMeshFromX(
  __in   LPCTSTR pFilename,//.X文件名
  __in   DWORD Options,//一般为D3DXMESH_MANAGED
  __in   LPDIRECT3DDEVICE9 pD3DDevice,//设备指针
  __out  LPD3DXBUFFER *ppAdjacency,//网格临接信息缓冲区指针
  __out  LPD3DXBUFFER *ppMaterials,//网格材质以及纹理信息缓冲区指针
  __out  LPD3DXBUFFER *ppEffectInstances,//网格特效缓冲区指针
  __out  DWORD *pNumMaterials,//材质信息个数
  __out  LPD3DXMESH *ppMesh//Mesh指针的指针
);

这里面有个新的数据类型LPD3DXBUFFER类型,我们看到好几种信息都是存在这种类型的指针所指向的缓冲区中了。如果我们想要获得特定类型的信息要肿么办呢?

DX为我们提供了一个函数:GetBufferPointer();例如,我们想要获得材质信息,就可以这样写:

D3DXMATERIAL *pMtrl = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer();

例如:

	D3DXLoadMeshFromX(TEXT("tiger.X"), D3DXMESH_MANAGED, g_pDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh);
从tiger.X中创建了一个Mesh模型,相关信息都存储在我们传入的参数所指向的缓冲区中啦。


2.载入材质和纹理信息:

通过上面的函数,我们获得了材质以及纹理信息,这些信息都存储在pMtrlBuffer所指向的缓冲区中,这些材质信息是使用D3DXMATERIAL结构体存储的,该结构体的定义如下:

typedef struct D3DXMATERIAL {
  D3DMATERIAL9 MatD3D;//材质信息
  LPSTR        pTextureFilename;//纹理贴图文件名
} D3DXMATERIAL, *LPD3DXMATERIAL;

这样,我们就可以从这pMtrlBuffer指针指向的缓冲区中提取Mesh模型的材质以及纹理信息,并将之用到我们要绘制的对象中去。而这个结构体的数量就存储在g_dwNumMtrls中,我们只需要遍历一下,就可以将纹理材质设置好。

例如:

LPD3DXBUFFER pAdjBuffer = NULL;				//临时缓冲区指针,存储对象模型信息
	LPD3DXBUFFER pMtrlBuffer = NULL;			//临时缓冲区指针,存储对象纹理材质信息
	//根据.X文件创建Mesh模型
	D3DXLoadMeshFromX(TEXT("tiger.X"), D3DXMESH_MANAGED, g_pDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh);

	//读取材质和纹理数据
	D3DXMATERIAL *pMtrl = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer();
	//真正存储材质以及纹理的缓冲区,动态申请内存
	g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls];
	g_pTextures = new 
Direct-X学习笔记--Direct-X的初始化 一.环境配置 从网上下载到DirectX SDK,双击安装,即可得到以下文件。 打开VS2012,打开项目的通用属性,按照图中方法配置库文件以及包含目录。 这样,环境就配置好了。 二.初始化步骤总览 要想使用Direct-X这么强大的功能的图形API,自然要做一番准备工作。具体就分为这么几步: (1) 获得一个IDirect3D9接口指针。这个接口用于获得物理设备的信息 阅读详情

相关推荐

Direct-X学习笔记--骨骼动画

学了几个月DX了,终于到了骨骼动画这一步了,好激动!之前导入过一些静态的模型,还是挺帅的。不过不能动,实在是太遗憾了。今天学习了骨骼动画,终于让偶的模型动起来啦!!! 一.简介 说到动画,其实本人又想起了最早开始写小游戏的时候从网上找的那些关键帧素材,设置一个定时器,或者根据游戏循环,不断切换图片,就形成了动态的效果。不过这样实在是太麻烦了,需要美术一张一张的画图或者用PS调整。到了3D时代,

puppet_master的专栏 2537

Direct-X学习笔记--地形

地形系统,在游戏中肯定少不了滴。终于要开始学习这个东东啦!地形看起来非常神奇,绵延的山峦,横看成岭侧成峰,远近高低各不同,这么复杂的地形到底我们到底要怎么写呢?说实话不学这个之前我真的完全想不到地形的实现方法。 一.简介 三维地形系统在很多地方都有应用,不论是游戏还是模拟系统中,地形都是必不可少的元素之一。说到地图,我们最容易想到的就是一个二维数组,根据数组元素的不同,绘制出不同的图形

puppet_master的专栏 2291

Direct-X学习笔记--Alpha颜色混合

Alpha混合技术是灰常有用的东东。待我好好学习一下。 一.简介 首先看一下Alpha通道,Alpha通道是计算机中存储图片透明度信息的通道,它是一个8位灰度的通道,用256级灰度记录图像中的透明信息,定义透明,不透明,半透明等,其中黑色表示完全透明,白色表示不透明,灰色为半透明。 如果不用Alpha混合,我们绘制图形的颜色总是替换当前颜色缓冲区中存在的颜色,这样后面的物体总是覆盖在原有的物

puppet_master的专栏 4642

Direct-X学习笔记--深度缓存

今天来学习一下深度测试,不过这个东东貌似暂时就是了解一下原理啦,因为DX默认是打开深度测试的,即我们不需要额外进行设置就可以使用深度测试的功能,不过这个还是有必要了解一下,一是对DX的流程更加了解,二是我们可以手动设置深度测试的参数以及函数,达到一些自己想要实现的效果。 一.简介 三维的世界中,有各种物体,而这些物体难免会有遮挡,而且同一个物体不同部分也会有遮挡的关系,要想表现出来更加

puppet_master的专栏 3163

Direct-X学习笔记--纹理映射进阶

之前学习了纹理映射相关知识,但是仅仅是知道读取一个纹理贴图,然后在绘制之前设置一下纹理,但是并不知道纹理设置的一些具体细节,今天就来填坑啦! 一.四种纹理寻址方式 我们读取一个纹理图片,最好的情况是所需要的图片大小和图片本身的大小一致,但是事实往往不是这么美好。所以当纹理图片的大小和我们所绘制的模型大小不一致时,就需要通过不同的纹理寻址方式来解决这个问题。 通常,我们取的纹理坐标为(

puppet_master的专栏 1798

Direct-X学习笔记--图元绘制

DX中有6种图元: 顶点集合,线段集合,线段条带,三角形集合,三角形条带,三角扇形。 在渲染时一般采用三角形来构成多边形,三角形三个顶点一定共面,共面的时候,渲染较快。 (该图片来自百度) 我们在绘制的时候,使用该函数绘制图元,第一个参数为图元的类型,即上图中的几种类型: 点列集合    D3DPT_POINTLIST   一组点的集合 线列集合    D3DPT_LI

puppet_master的专栏 1771

Direct-X学习笔记--三维粒子系统

哇塞,一转眼已经到了传说中的粒子系统了,学会了粒子系统就可以做出一些更好玩的效果啦!加油啦! 一.简介 粒子系统,正如其名称,由各种小的粒子构成。通常用来模拟火焰,爆炸,烟,水流,火花,落叶,雨,雪等等难以用具体的形状来描述的物体。单个的粒子非常简单,可以用多边形来表示,甚至用像素表示。但是,不要小看了这样微小的粒子,当粒子的数量级达到上千,上万,甚至十万时,表现力是及其震撼的! 下

puppet_master的专栏 1761

Direct-X学习笔记--变换

1.顶点格式改动: 之前写的几个例子都是2D的例子,使用的顶点格式是已经经过变换的顶点格式。而要写3D程序,我们就必须要用未经过变换的顶点。所以在定义顶点时也要有所改变://------------绘制图形步骤1.定义灵活顶点格式 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)//坐标为经过变换的屏幕坐标,顶点的颜色 //----

puppet_master的专栏 1191

Direct Preference Optimization (DPO)原理详解及公式推导

本文讲解Direct Preference Optimization (DPO)原理以及推导过程。

日常学习与专研的记录 2万+

Direct-X学习笔记--三维摄像机

一.介绍 哇!到了传说中的3D摄像机啦! 之前我们写的东东,都是观察点不动,通过世界变换让东西动,今天,通过三维摄像机我们就可以改变我们的观察点,观察方向,随意在三维空间中驰骋。之前我们所设定的视角都是通过D3DXMatrixLookAtLH这个函数,通过几个设定好的向量,将视角初始化的,而在程序真正运行时,视角就不再改变了,而这次,我们要实时的生成视角变换矩阵,实时的改变我们的视角,我们所谓

puppet_master的专栏 3291

学习directX实用的x文件模型

包含一些人物和场景的.x文件,模型资源,希望能给学习directX的新手们以帮助

Direct3D 写的浏览.x模型

浏览D3D模型工具,仅支持 把.x文件拖拉至窗口即可浏览 -A tool of View D3D Modal, suport only drag the Modal into the windows, that s all.

手把手教你用STM32硬件SPI驱动BMI088陀螺仪(附完整代码)

本文提供了一份详尽的STM32硬件SPI驱动BMI088陀螺仪的实战指南。内容涵盖从硬件连接、SPI底层配置、驱动层封装到设备初始化、数据读取与同步策略,并深入探讨了数据处理、滤波融合及温度补偿等核心技巧,旨在帮助开发者构建稳定高效的IMU驱动框架,解决BMI088应用中常见的挑战。

quiet的专栏 528

携程酒店数据爬取进阶:动态接口破解与反反爬策略实战

本文详细解析了携程酒店数据爬取的进阶技巧,包括动态接口参数破解、反爬虫策略对抗及企业级采集方案实现。重点介绍了eleven参数的生成逻辑、动态Cookie维护方法,以及如何应对携程的请求指纹检测和行为模式识别。通过实战案例,帮助开发者高效获取酒店价格数据,同时遵守行业规范。

eee77的博客 1078

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1592

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3196

通达信浮筹多空波段抓牛擒龙指标公式源码

VAR33:=VA3>=REF(VA4,1) AND C<REF(C,1) AND VAR19=60 AND VAR18=0 AND 活跃线>=REF(活跃线,1) AND VA12<REF(VA13,1);DRAWTEXT(VAR28 AND COUNT(VAR28,30)=1,65,' ★超涨注意风险'),COLOR0000FF;DRAWTEXT(VAR26 AND COUNT(VAR26,30)=1,90,' ←继续等'),COLOR00FFFF;浮筹线:VA3,COLORFF00FF;

2401_86043146的博客 5256

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 295

python批量调用大模型API:多线程和异步协程

本文介绍了利用多线程技术批量调用大模型API的实现方法。核心是通过并发请求提高处理效率,主要采用线程池管理并发数量、结果聚合等技术。文章提供了一个完整的Python实现示例,包含APIBatchCaller类及其single_api_call和batch_call方法,详细解析了并发控制、错误处理等关键点,并给出了使用注意事项,包括并发数设置、重试策略和超时处理等。该方案特别适合IO密集型任务,能显著提升批量API调用的效率。

Cachel Wood的博客 759

硬件工程师学习-硬件的单元测试(UT)(1)电源与时钟的测试

我们在设计的时候,通过控制电源的上电使能管脚或者通过MOSFET、或者专用的电源上电控制芯片,控制不同电源的上电时序,以确保每个芯片的电源上电时序是满足芯片的要求的。我们在测试的时候,需要对相关的要求一一测试,以确认每个上电时序满足要求的。在维基百科中,相位噪声的定义是“时域不稳定性(抖动)导致波形在相位上发生快速、短期、随机的波动,这种波动在频域中的表现即为相位噪声”。单元测试,一般是指基于开发人员自行开展的功能测试及各个功能单元的单元测试,是硬件信号级的测试,分为基本测试和信号完整性测试。

qq_43416206的博客 4033

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: Direct-X学习笔记--纹理映射
下一篇: Direct-X学习笔记--三维摄像机
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值