DirectX11 学习笔记10 - 用文件存储顶点布局
这节须要把顶点布局写在文件中面,为了方便。由于一大串很抽象的坐标放在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 - 用文件存储顶点布局的更多相关文章
- CUBRID学习笔记 10 数据库文件的类型和含义
demodb contains the database data; demodb_lgar000, 001 and so forth are log archives used for point ...
- Directx11学习笔记【二十二】 用高度图实现地形
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...
- 《C++ Primer Plus》学习笔记10
<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- Directx11学习笔记【二】 将HelloWin封装成类
我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...
- Directx11学习笔记【一】 最简单的windows程序HelloWin
声明:本系列教程代码有部分来自dx11龙书及dx11游戏编程入门两本书,后面不再说明 首先,在vs2013中创建一个空的解决方案Dx11Demo,以后的工程都会放在这个解决方案下面.然后创建一个win ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
随机推荐
- luogu1120 小木棍【数据加强版】 暴力剪枝
题目大意 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.给出每段小木棍的长度,编程帮 ...
- Node.js:GET/POST请求
ylbtech-Node.js:GET/POST请求 1.返回顶部 1. Node.js GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器一般 ...
- 【BZOJ1565】【NOI2009】植物大战僵尸
好久没写博客了 题目 题目在这里 思路&做法 没什么好说的 应该很容易看出是 最大闭合子图 吧? 不过要注意一下的是,这题 可能有植物是不可能被击溃的 , 所以要先跑一遍 拓扑排序 把这些点排 ...
- 深入理解 python 元类
一.什么的元类 # 思考: # Python 中对象是由实例化类得来的,那么类又是怎么得到的呢? # 疑问: # python 中一切皆对象,那么类是否也是对象?如果是,那么它又是那个类实例化而来的呢 ...
- SwiftUI 官方教程(八)
8. 动态生成预览 接下来,我们会在 LandmarkList_Previews 中添加代码以在不同的设备尺寸上渲染列表.默认情况下,预览会以当前的 scheme 中设备的大小进行渲染.我们可以通过调 ...
- 对JVM还有什么不懂的?一文章带你深入浅出JVM!
本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...
- POJ 3620 DFS
题意: 给你n*m的矩形,有k个坏点 问最大坏点连通块的坏点数. 一发水题.. 裸的DFS // by SiriusRen #include <cstdio> #include <a ...
- guice基本使用,三种注入方式(二)
guice提供了强大的注入方式. 1.属性注入 2.构造器注入 3.set方式注入 1.属性注入: package com.ming.user.test; import com.google.inje ...
- .net几种文件下载的方法
.Net文件下载方式.... 之前在写上传文件.下载文件的时候,发现Response对象里面有好几种下载文件的方式,之后自己亲自实践了这几种方法,记录下以便以后复习... WriteFile文件下载 ...
- js原生_获取url键值对
思路: 1.先对url进行处理,获取 ?后的字符串 postid=10457794&actiontip=保存修改成功') 2. 字符串通过&标识,不同参数转为数组 ["pos ...