- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试加载没有法线或纹理坐标的 Obj 文件时,我得到一个超出范围的 vector 下标。如果我加载一个包含法线和纹理坐标的 obj 文件,那么一切正常。所以我只是问如何修改我的代码以加载没有法线和纹理坐标的 obj 文件。
这是我存储 VERTEX 数据的结构
struct VERTEX
{
XMFLOAT3 position;
XMFLOAT3 normal;
XMFLOAT2 texcoord;
};
这些顶点用于存储数据
std::vector<XMFLOAT3> m_position;
std::vector<XMFLOAT2> m_texCoords;
std::vector<XMFLOAT3> m_normals;
std::vector<VERTEX> m_vertices;
std::vector<DWORD> m_Indices;
VERTEX vertex;
这就是我阅读面部线条的方式。这一切都很好,但我不确定这是否是我的程序在没有法线和纹理坐标的情况下加载 obj 文件时中断的原因。
else if (strcmp(buffer, "f") == 0)
{
int fPosition, fTexCoord, fNormal; //data of a single vertex
for (int iFace = 0; iFace < 3; iFace++)
{
ZeroMemory(&vertex, sizeof(VERTEX));
file >> fPosition;
vertex.position = m_position[fPosition - 1];
if (file.peek() == '/')
{
file.ignore();
if (file.peek() != '/')
{
file >> fTexCoord;
vertex.texcoord = m_texCoords[fTexCoord - 1];
}
if (file.peek() == '/')
{
file.ignore();
file >> fNormal;
vertex.normal = m_normals[fNormal -1];
}
m_vertices.push_back(vertex);
m_Indices.push_back(m_vertices.size() - 1);
}
}
}
最后这就是我设置顶点缓冲区的方式
D3D11_INPUT_ELEMENT_DESC vertlayout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
ID3D11Device* pDevice = m_shader->GetDevice();
ID3DBlob* pVSBlob = m_shader->GetVSBlob();
pDevice->CreateInputLayout(vertlayout, ARRAYSIZE(vertlayout), pVSBlob->GetBufferPointer(),
pVSBlob->GetBufferSize(), &m_vertexLayout);
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(VERTEX)* m_vertices.size();
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA initData;
ZeroMemory(&initData, sizeof(initData));
initData.pSysMem = &m_vertices[0]; //This is where it breaks
pDevice->CreateBuffer(&bd, &initData, &m_vertexBuffer);
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(DWORD)* m_Indices.size();
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
initData.pSysMem = &m_Indices[0]; //and it breaks here too
pDevice->CreateBuffer(&bd, &initData, &m_indexBuffer);
正如评论所说,在 initData.pSysMem = &m_vertices[0];
和 initData.pSysMem = &m_Indices[0];
的行中,我的程序将中断我会得到 vector 下标超出范围的错误。如果我从 &m_vertices 和 &m_Indices 中删除 [0],它不会中断,但不会呈现任何内容。
我只想知道如何让我的 obj 加载器加载不需要始终具有所有 4 个顶点、法线、纹理坐标和面的 obj 文件。
最佳答案
您无法仅通过猜测找出您的应用程序崩溃的原因。而你不需要。作为程序员,我们有很好的工具来解决这些问题。因此,一般建议:学习使用调试器。
你的载体是空的。
当您尝试访问不存在的第一个元素(m_vertices[0]
和 m_Indices[0]
)时,您会得到这个断言失败(因为您处于 Debug模式;在 Release模式下它将静默触发未定义的行为)。
当程序执行在这些行上中断时,检查“调用堆栈”窗口,看看您在哪个函数中。找到你的一个函数,它在堆栈中最高,然后单击它。检查“Locals”、“Auto”或“Watch”窗口(菜单“Debug”->“Windows”)以查看范围内的 vector 和其他变量的内容。放置断点并在需要时重启应用。
在程序的前面设置断点,看看为什么你的 vector 是空的。逐行移动,逐个函数,使用“Step into”和“Step over”,观察变量,直到找到错误源。
如果那里有空 vector 是有效的,您可以创建分支以避免访问其内容的代码路径:
if(!m_vertices.empty())
{
// Create buffers with data
}
else
{
// Create empty buffers or report an error
}`
希望对您有所帮助。
关于c++ - 尝试在 DirectX 11 中加载 Obj 文件时 vector 下标超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254544/
是否可以创建一个可以使用显式参数标签调用的下标? struct MyType { subscript (label: Bool) -> String? { return nil
我正在尝试制作一个包含带有上标和/或下标的文本的超链接。我找到了两种方法来做到这一点,它们都很糟糕。 解决方案#1:使用 Typography.Variants .这为某些字体提供了极好的上标……。
在这里! 我想在 geom_bracket 中包含一个带下标的标签在 ggplot2 .我尝试了不同的方式,但没有人成功(评论中的尝试): library(ggplot2) ggplot(data =
我正在尝试让 graphviz 启动并工作,我迫切需要节点标签中的下标。不幸的是,通过浏览无数关于类似问题的帖子,我似乎适合所有建议的解决方案,但仍然不起作用。这是我的代码: digraph G{
抱歉格式问题,我从来没有真正在这样的论坛上发帖,所以我必须学习一下操作方法。 我的问题是:我正在编写一个模板类,我想通过多种 [] 运算符访问我的容器。我读了一些关于这个主题的内容,所以我已经能够重载
我知道我们可以像在 matplotlib 中生成单个下标 $r_i$ 会给我一个下标为“i”的r。 但我想生成一个包含 3 或 4 个字母的下标,例如 r_ijk 应该给我一个带有“ijk”作为下标的
this[5] 有什么作用?我是否调用了某种未定义的行为?关于: std::vector foo{this, this + 5u}; 这个有用吗?我想知道指针算法对 this 的影响是什么。这是一个测
我从 visual studio 得到了一些奇怪的行为,关于以下代码片段,错误列表显示了 E0349 的几个实例:没有运算符“[]”匹配这些操作数。 Intellisense 似乎暗示类型不匹配,但正
我想为我的数组类提供 PHP 样式的 push_back 功能: arrayT arr; arr[] = 10; // == std::vector::push_back() 和 arrayT::op
下标 (subscripts)可以定义在类(class)、结构体(structure)和枚举(enumeration)中,是访问集合(collection),列表(list)或序列(sequence)
我正在使用traindata训练svm。 (R中的e1071软件包)。以下是有关我的数据的信息。 > str(train) 'data.frame': 891 obs. of 10 variab
#include int main(){ int arr[7] = {0,1,2,3,4,3,2}; arr[0]++[arr]++[arr]++[arr]++[arr]++[arr]
如果我想以特定用户的身份调用主脚本文件中的另一个 shell 脚本,我该怎么做呢?子脚本似乎失去了它正在运行的用户的上下文,我还没有找到任何有用的子脚本技术。 例如:war-install.sh if
这个问题在这里已经有了答案: Why isn't there an operator[] for a std::list? (4 个答案) 关闭 5 年前。 我有这些类型定义: typedef pa
我在 NSUserdefaults 中获取字典的字符串时遇到问题,这是我的代码。我不知道似乎是什么问题: static func getItemInUserDefaultsDictionary(key
我正在尝试执行以下代码并收到错误 Could not find member 'subscript on Xcode6 var b:[[Float]] = [[1,2]] var i2 = 0 //
我尝试运行的代码: std::string genBlankName(std::vector &posts) { std::string baseName = "New Post ";
1 1 A_{3} 2 2 C_{2} 3 3 ^{5}C_{1} 我有一个这样的输入文件要绘制。第三列是该点上的标签( latex 格式)。我如何在绘图上显示这些标签,就像它们在 latex 编译后
我在这里搜索了一段时间,之前的问题/答案部分回答了我的问题。我正在学习 R,来自 Matlab。正如标题所说,我有一个关于情节注释的问题。在 Matlab 中,绘制包含各种数据格式的注释非常简单,我正
我想将一些化学数据放入表格的列中。但在现有表格中,下标显示为普通字符。其中一些显示为问号。我应该怎么做才能解决它? 当我输入这段代码时 SELECT N'H' + NCHAR(0x2082) + N
我是一名优秀的程序员,十分优秀!