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的开放 ...
随机推荐
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
- 11g Rac PSU20180116手动补丁升级步骤
手动升级:软件包解压在新建的/home/grid/update 目录下ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1GRID_HOME=/u01 ...
- java selenium手动最大化chrome浏览器的方法
package my_automation; import java.awt.Dimension; import org.openqa.selenium.Capabilities; import or ...
- ORACLE.错误码 ORA-12154 及Oracle客户端免安装版的设置
.错误码 ORA-12154相信作为ORACLE数据库的开发人员没有少碰到“ORA-12154: TNS: 无法解析指定的连接标识符”,今天我也又碰到了类似的情况,将我的解决方法进行小结,希望能对碰到 ...
- MD5三种方法的学习总结
MD5百度百科 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已 ...
- javascript一个作用域案例分析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 用css修改HTML5 input placeholder颜色
使用CSS修改HTML5 input placeholder颜色 本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和 ...
- Ubuntu安装配置Python.pyDev
一:安装ECLipse Eclipse官网下载软件tar包: 使用解压命令: sudo tar xzvf xxxxx.tar.gz -c /opt/ 创建快捷方式到桌面. 二:安装python-Num ...
- RabbitMQ学习之spring配置文件rabbit标签的使用
下面我们通过一个实例看一下rabbit的使用. 1.实现一个消息监听器ReceiveMessageListener.Java package org.springframework.amqp.core ...
- 优动漫PAINT如何打开图形文件
优动漫PAINT也就是我们常说的clip studio paint(CSP)的中文版本,在优动漫PAINT软件中打开文件的方式有很多,您可以直接拖拽至优动漫PAINT界面或者文档窗口,也可以执行文件菜 ...