博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX11 学习笔记10 - 用文件存储顶点布局
阅读量:6236 次
发布时间:2019-06-22

本文共 4951 字,大约阅读时间需要 16 分钟。

这节须要把顶点布局写在文件中面,为了方便。由于一大串很抽象的坐标放在CPP和程序混在一起很的不方便。

以下全为c++知识,读取文件中面的特定格式的数据:

Vertex Count: 36Data:-1.0  1.0 -1.0 0.0 0.0  0.0  0.0 -1.0 1.0  1.0 -1.0 1.0 0.0  0.0  0.0 -1.0-1.0 -1.0 -1.0 0.0 1.0  0.0  0.0 -1.0-1.0 -1.0 -1.0 0.0 1.0  0.0  0.0 -1.0 1.0  1.0 -1.0 1.0 0.0  0.0  0.0 -1.0 1.0 -1.0 -1.0 1.0 1.0  0.0  0.0 -1.0 1.0  1.0 -1.0 0.0 0.0  1.0  0.0  0.0 1.0  1.0  1.0 1.0 0.0  1.0  0.0  0.0 1.0 -1.0 -1.0 0.0 1.0  1.0  0.0  0.0 1.0 -1.0 -1.0 0.0 1.0  1.0  0.0  0.0 1.0  1.0  1.0 1.0 0.0  1.0  0.0  0.0 1.0 -1.0  1.0 1.0 1.0  1.0  0.0  0.0 1.0  1.0  1.0 0.0 0.0  0.0  0.0  1.0-1.0  1.0  1.0 1.0 0.0  0.0  0.0  1.0 1.0 -1.0  1.0 0.0 1.0  0.0  0.0  1.0 1.0 -1.0  1.0 0.0 1.0  0.0  0.0  1.0-1.0  1.0  1.0 1.0 0.0  0.0  0.0  1.0-1.0 -1.0  1.0 1.0 1.0  0.0  0.0  1.0-1.0  1.0  1.0 0.0 0.0 -1.0  0.0  0.0-1.0  1.0 -1.0 1.0 0.0 -1.0  0.0  0.0-1.0 -1.0  1.0 0.0 1.0 -1.0  0.0  0.0-1.0 -1.0  1.0 0.0 1.0 -1.0  0.0  0.0-1.0  1.0 -1.0 1.0 0.0 -1.0  0.0  0.0-1.0 -1.0 -1.0 1.0 1.0 -1.0  0.0  0.0-1.0  1.0  1.0 0.0 0.0  0.0  1.0  0.0 1.0  1.0  1.0 1.0 0.0  0.0  1.0  0.0-1.0  1.0 -1.0 0.0 1.0  0.0  1.0  0.0-1.0  1.0 -1.0 0.0 1.0  0.0  1.0  0.0 1.0  1.0  1.0 1.0 0.0  0.0  1.0  0.0 1.0  1.0 -1.0 1.0 1.0  0.0  1.0  0.0-1.0 -1.0 -1.0 0.0 0.0  0.0 -1.0  0.0 1.0 -1.0 -1.0 1.0 0.0  0.0 -1.0  0.0-1.0 -1.0  1.0 0.0 1.0  0.0 -1.0  0.0-1.0 -1.0  1.0 0.0 1.0  0.0 -1.0  0.0 1.0 -1.0 -1.0 1.0 0.0  0.0 -1.0  0.0 1.0 -1.0  1.0 1.0 1.0  0.0 -1.0  0.0
数据就是上面这个样子。就没有索引点了,每一个顶点自己主动反复了。

#include 
#include
using namespace std;int main(){ ifstream in; in.open("cube.txt"); if(!in) { cout<<"打开失败"<
>count; cout<
<
>f[i]; for(int i=0;i<8;i++) cout<
<<" "; cout<
上面是纯c++代码,仅仅是一个读取的列子。下节再更新怎样在模型初始化里面套用。

本文转载请注明:Younfor的博客笔记,http://blog.csdn.net/cq361106306/article/details/40300205

假设套用呢。仅仅须要在模型文件中改即可了。

#pragma  once#include "XComm.h"#include 
#include
class CubeModel{protected: struct SimpleVertex { XMFLOAT3 Pos; XMFLOAT3 Normal; }; struct ModelType { float x, y, z; float tu, tv; float nx, ny, nz; }; ModelType* m_model; //模型顶点坐标数据结构public://顶点缓冲和顶点索引缓冲 ID3D11Buffer *m_vertexBuffer, *m_indexBuffer; int m_vertexCount, m_indexCount;public: CubeModel():m_vertexCount(0),m_indexCount(0){}; bool init(ID3D11Device*); void close(); void render(ID3D11DeviceContext*); bool loadModel(char * filename);};
上面头文件里  多了一个struct ModelType 这个主要是获取数据然后存储到内存的格式。

然后多了一个loadModel()函数 这个里面就写上面的纯c++代码了

以下改动初始化模型 init() 函数里面的前面一部分

unsigned long* indices;	SimpleVertex *vertices;	D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc;	D3D11_SUBRESOURCE_DATA vertexData, indexData;	//导入模型数据	if(!loadModel("cube.txt"))	{		return false;	}	// 创建顶点暂时缓冲.	vertices = new SimpleVertex[m_vertexCount]; 	// 创建索引缓冲.	indices = new unsigned long[m_indexCount];	for(int i=0; i
这个事实上就是把内存中的那个m_model[i] 模型数据赋值到顶点结构中。 这里索引顶点和实际顶点的个数是一摸一样的。

以下这个代码是之前的赋值。

//首先,我们创建2个暂时缓冲存放顶点和索引数据,以便后面使用。

. // 设置顶点缓冲大小为3。一个三角形. m_vertexCount = 8; // 设置索引缓冲大小. m_indexCount = 36; //6面*2三角形*3个点 // 创建顶点暂时缓冲. SimpleVertex vertices[] = { {XMFLOAT3(-1.0f, -1.0f, -1.0f),WHITE}, {XMFLOAT3(-1.0f, 1.0f, -1.0f),BLACK}, {XMFLOAT3(1.0f, 1.0f, -1.0f),RED}, {XMFLOAT3(1.0f, -1.0f, -1.0f),GREEN}, {XMFLOAT3(-1.0f, -1.0f, 1.0f),BLUE}, {XMFLOAT3(-1.0f, 1.0f, 1.0f),YELLOW}, {XMFLOAT3(1.0f, 1.0f, 1.0f),CYAN}, {XMFLOAT3(1.0f, -1.0f, 1.0f),MAGENTA}, }; //右移一段距离 for(int i=0;i<8;i++) vertices[i].Pos.x+=6.0f; // 创建索引缓冲. indices = new unsigned long[m_indexCount]; // 设置索引缓冲数据. indices[0] = 0; // 前面 indices[1] = 1; indices[2] = 2; indices[3] = 0; indices[4] = 2; indices[5] = 3; indices[6] = 4; // 后面 indices[7] = 6; indices[8] = 5; indices[9] = 4; indices[10] = 7; indices[11] = 6; indices[12] = 4; // 左面 indices[13] = 5; indices[14] = 1; indices[15] = 4; indices[16] = 1; indices[17] = 0; indices[18] = 3; //右面 indices[19] = 2; indices[20] = 6; indices[21] = 3; indices[22] = 6; indices[23] = 7; indices[24] = 1; // 上面 indices[25] = 5; indices[26] = 6; indices[27] = 1; indices[28] = 6; indices[29] = 2; indices[30] = 4; // 以下 indices[31] = 0; indices[32] = 3; indices[33] = 4; indices[34] = 3; indices[35] = 7;

明显要麻烦很多对不正确。

然后初始化里面我调用了一个loadModel函数。 我把里面的參数"cube.txt"放到了project文件夹以下和.fx效果文件平级的地方

bool CubeModel::loadModel(char * filename){	std::ifstream in;  	in.open(filename);  	if(!in)  	{  		std::cout<<"打开失败"<
>count; m_model = new ModelType[count]; m_vertexCount=count; m_indexCount=count; while(ch=in.get(),ch!=':');//跳过"Data:" for(int i=0;i
>m_model[i].x>>m_model[i].y>>m_model[i].z; in>>m_model[i].tu>>m_model[i].tv; in>>m_model[i].nx>>m_model[i].ny>>m_model[i].nz; } in.close(); in.clear(); return true;}
这里就是之前文章开头写的一段c++代码核心。

然后再close写一下释放内存即可了。

void CubeModel::close(){	//释放模型	if(m_model)	{		delete []m_model;		m_model=0;	}	// 释放顶点缓冲.	if(m_indexBuffer)	{		m_inde.......

转载于:https://www.cnblogs.com/clnchanpin/p/7080863.html

你可能感兴趣的文章
Ubimax面向企业推出Frontline平台,提供完整AR解决方案
查看>>
2017VR创新创业大赛:500万奖金创VR赛事最高纪录
查看>>
叮!您收到一份超值Java基础入门资料!
查看>>
数据库入侵的六大手段与防范措施(一)
查看>>
互联网广告的进化之路-技术篇【计算广告】
查看>>
记一次Redis超时排查
查看>>
浅谈GPU虚拟化技术(五):GPU图形渲染虚拟化的业界难题-VDI的用户体验
查看>>
芯片大神离职特斯拉,马斯克造芯梦碎可能会抱黄仁勋大腿
查看>>
Ubuntu 16.04安装indicator-sysmonitor实现导航条显示上下行网速/CPU/内存使用率
查看>>
《App架构师实践指南》:移动开发的进阶指南
查看>>
C++参考的翻译或校对
查看>>
Jetty错误:java.lang.IllegalStateException: Form too large 270468>200000的问题解决
查看>>
Linux多线程2-1---创造新线程
查看>>
菜鸟学Linux 第001天笔记 基础理论知识
查看>>
Python学习(25)--面向对象编程2
查看>>
BLE Hacking:使用Ubertooth one扫描嗅探低功耗蓝牙
查看>>
JAVA入门[3]—Spring依赖注入
查看>>
开黑吗?VRstudio推出八人系统的VR线下竞技场
查看>>
备份和导入Outlook 2016 电子邮件签名
查看>>
自建企业网盘异军突起,“私人定制”优势面面观
查看>>