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

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

Vertex Count: 36

Data:

-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 <iostream>
#include <fstream> using namespace std; int main()
{
ifstream in;
in.open("cube.txt");
if(!in)
{
cout<<"打开失败"<<endl;
}else
{
cout<<"打开成功"<<endl;
} char ch;
int count;
float f[8];
while(ch=in.get(),ch!=':');//跳过"Vertex Count:"
in>>count;
cout<<count<<endl;
while(ch=in.get(),ch!=':');//跳过"Data:"
while(!in.eof())
{
for(int i=0;i<8;i++)
in>>f[i];
for(int i=0;i<8;i++)
cout<<f[i]<<" ";
cout<<endl;
} in.close();
in.clear();
getchar();
}

上面是纯c++代码,仅仅是一个读取的列子。下节再更新怎样在模型初始化里面套用。

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

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

#pragma  once
#include "XComm.h"
#include <fstream>
#include <iostream>
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_vertexCount; i++)
{
vertices[i].Pos = XMFLOAT3(m_model[i].x, m_model[i].y, m_model[i].z);
vertices[i].Normal = XMFLOAT3(m_model[i].nx, m_model[i].ny, m_model[i].nz); indices[i] = 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<<"打开失败"<<std::endl;
}else
{
std::cout<<"打开成功"<<std::endl;
} char ch;
int count;
while(ch=in.get(),ch!=':');//跳过"Vertex Count:"
in>>count;
m_model = new ModelType[count];
m_vertexCount=count;
m_indexCount=count;
while(ch=in.get(),ch!=':');//跳过"Data:"
for(int i=0;i<count;i++)
{
in>>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.......

DirectX11 学习笔记10 - 用文件存储顶点布局的更多相关文章

  1. CUBRID学习笔记 10 数据库文件的类型和含义

    demodb contains the database data; demodb_lgar000, 001 and so forth are log archives used for point ...

  2. Directx11学习笔记【二十二】 用高度图实现地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...

  3. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  4. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  5. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  6. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  7. Directx11学习笔记【一】 最简单的windows程序HelloWin

    声明:本系列教程代码有部分来自dx11龙书及dx11游戏编程入门两本书,后面不再说明 首先,在vs2013中创建一个空的解决方案Dx11Demo,以后的工程都会放在这个解决方案下面.然后创建一个win ...

  8. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  9. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

随机推荐

  1. NOIP2011 day2 第一题 计算系数

    计算系数 NOIP2011 day2 第一题 描述 给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m项的系数. 输入格式 共一行,包含5 个整数,分别为 a ,b ,k ,n ,m, ...

  2. Solr.NET快速入门(八)【多核多实例,映射验证】

    多核/多实例 本页介绍如何配置SolrNet访问(读/写)多个Solr内核或实例. 它假定您知道Solr内核是什么,如何在SolrNet外部配置和使用它们. 此页面不涵盖CoreAdminHandle ...

  3. Kafka 分布式消息系统详解

    实际上kafka对机器的需求与Hadoop的类似. 原来,对于Linkin这样的互联网企业来说,用户和网站上产生的数据有三种: 需要实时响应的交易数据,用户提交一个表单,输入一段内容,这种数据最后是存 ...

  4. mysql的模糊查询

    mysql模糊查询like/REGEXP(1)like / not like MySql的like语句中的通配符:百分号.下划线和escape %:表示任意个或多个字符.可匹配任意类型和长度的字符. ...

  5. ES : 软件工程学的复杂度理论及物理学解释

    系统论里面总是有一些通用的专业术语 比如复杂度.熵.焓,复杂度专门独立出来,成为复杂度理论 文章摘抄于:<非线性动力学> 刘秉政 编著  5.5 复杂性及其测度 热力学的几个专业术语 熵. ...

  6. SpringMVC(二)@RequestMapping

    学习@RequestMapping注解,参考Spring API 1.@RequestMapping可以修饰在类类型和方法上      ①.修饰在类定义上:   提供初步的URL映射,相对于web应用 ...

  7. mindmanager 2018 中文破解版_注册码_免激活

    MindManager 2018是一个可视化的工具,可以用在脑力风暴(brainstorm)和计划(plan)当中.为商务人士提供更有效的.电子化手段捕捉.组织和联系信息(information)和想 ...

  8. VMware WorkStation 用 VMTools 官方下载地址

    每次安装 VMTools 都不成功,谷歌到了这个地址,特地分享. 先打开这个网址, 选择你的 VMware WorkStation 对应的版本号: http://softwareupdate.vmwa ...

  9. python调用函数实现数据的增删改查(2)

    1  添加数据 def add(): # 输入姓名,年龄,电话 name=raw_input('name:') age=raw_input('age:') phone=raw_input('phone ...

  10. DNS解析过程详解(转载)

    DNS解析过程详解(转载) DNS Domain Name System 域名系统,它就是根据域名查出IP地址.    先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址ww ...