通过 Assimp 加载的网格看起来变形了
Meshes loaded via Assimp look distorted
所以我正在尝试使用 assimp 和 DirectX11 加载和渲染网格。(我松散地遵循了 youtube 上的教程)问题是它看起来很奇怪和扭曲。我检查了我的网格 - 搅拌机和 assimp 查看器正确加载它们。
从 obj 文件渲染 suzanne 的结果:
Suzanne from obj file
看起来索引缓冲区有点错误,但我在传播它时没有看到错误;
网格加载代码:
struct Vertex
{
struct
{
float x;
float y;
float z;
}Position;
};
Model::Model(const std::string & path)
{
Ref<Zephyr::VertexShader> VertexShader = Zephyr::VertexShader::Create("MinimalShaders.hlsl", "VertexShaderMain");
AddBindable(VertexShader);
AddBindable(Zephyr::PixelShader::Create("MinimalShaders.hlsl", "PixelShaderMain"));
AddBindable(Zephyr::Topology::Create(Zephyr::Topology::TopologyType::TriangleList));
std::vector<Zephyr::InputLayout::InputLayoutElement> InputLayout =
{
{"Position",Zephyr::InputLayout::InputDataType::Float3}
};
AddBindable(Zephyr::InputLayout::Create(InputLayout, VertexShader));
Assimp::Importer Imp;
auto model = Imp.ReadFile(path, aiProcess_JoinIdenticalVertices | aiProcess_Triangulate);
const auto Mesh = model->mMeshes[0];
std::vector<Vertex> Vertices;
Vertices.reserve(Mesh->mNumVertices);
for (unsigned int i = 0; i < Mesh->mNumVertices; i++)
{
Vertex buf;
buf.Position = { Mesh->mVertices[i].x,Mesh->mVertices[i].y ,Mesh->mVertices[i].z };
Vertices.push_back(buf);
}
std::vector<unsigned short> Indices;
Indices.reserve(Mesh->mNumFaces * 3);
for (unsigned int i = 0; i < Mesh->mNumFaces; i++)
{
const auto & face = Mesh->mFaces[i];
if (face.mNumIndices != 3)
{
Zephyr::Log::Error("More than 3 indices per face ?!"); continue;
}
Indices.push_back(face.mIndices[0]);
Indices.push_back(face.mIndices[1]);
Indices.push_back(face.mIndices[2]);
}
AddBindable(Zephyr::VertexBuffer::Create(Vertices));
BindIndexBuffer(Zephyr::IndexBuffer::Create(Indices));
}
我的着色器很少
cbuffer CBuff
{
matrix transform;
};
float4 VertexShaderMain(float3 position : Position) : SV_POSITION
{
return mul(float4(position, 1.0), transform);
}
float4 PixelShaderMain() : SV_TARGET
{
return float4(1.0,1.0,1.0,1.0);
}
我的管道正确呈现,f。前任。硬编码的多维数据集,但是当我尝试从文件加载多维数据集时,会发生这种情况:
distorted cube
Assimp 打开文件并加载正确数量的顶点。指数的数量似乎还可以(对于立方体,有 12 个三角形和 36 个指数)
老实说,此时我不知道我做错了什么。我是否遗漏了一些明显的东西?
提前致谢
所以我想通了。问题是在其他一些文件中我已经定义了名为 Vertex 的结构。该结构还包含 uv,因此最终我的顶点缓冲区变得一团糟。愚蠢的错误。
所以我正在尝试使用 assimp 和 DirectX11 加载和渲染网格。(我松散地遵循了 youtube 上的教程)问题是它看起来很奇怪和扭曲。我检查了我的网格 - 搅拌机和 assimp 查看器正确加载它们。 从 obj 文件渲染 suzanne 的结果: Suzanne from obj file
看起来索引缓冲区有点错误,但我在传播它时没有看到错误; 网格加载代码:
struct Vertex
{
struct
{
float x;
float y;
float z;
}Position;
};
Model::Model(const std::string & path)
{
Ref<Zephyr::VertexShader> VertexShader = Zephyr::VertexShader::Create("MinimalShaders.hlsl", "VertexShaderMain");
AddBindable(VertexShader);
AddBindable(Zephyr::PixelShader::Create("MinimalShaders.hlsl", "PixelShaderMain"));
AddBindable(Zephyr::Topology::Create(Zephyr::Topology::TopologyType::TriangleList));
std::vector<Zephyr::InputLayout::InputLayoutElement> InputLayout =
{
{"Position",Zephyr::InputLayout::InputDataType::Float3}
};
AddBindable(Zephyr::InputLayout::Create(InputLayout, VertexShader));
Assimp::Importer Imp;
auto model = Imp.ReadFile(path, aiProcess_JoinIdenticalVertices | aiProcess_Triangulate);
const auto Mesh = model->mMeshes[0];
std::vector<Vertex> Vertices;
Vertices.reserve(Mesh->mNumVertices);
for (unsigned int i = 0; i < Mesh->mNumVertices; i++)
{
Vertex buf;
buf.Position = { Mesh->mVertices[i].x,Mesh->mVertices[i].y ,Mesh->mVertices[i].z };
Vertices.push_back(buf);
}
std::vector<unsigned short> Indices;
Indices.reserve(Mesh->mNumFaces * 3);
for (unsigned int i = 0; i < Mesh->mNumFaces; i++)
{
const auto & face = Mesh->mFaces[i];
if (face.mNumIndices != 3)
{
Zephyr::Log::Error("More than 3 indices per face ?!"); continue;
}
Indices.push_back(face.mIndices[0]);
Indices.push_back(face.mIndices[1]);
Indices.push_back(face.mIndices[2]);
}
AddBindable(Zephyr::VertexBuffer::Create(Vertices));
BindIndexBuffer(Zephyr::IndexBuffer::Create(Indices));
}
我的着色器很少
cbuffer CBuff
{
matrix transform;
};
float4 VertexShaderMain(float3 position : Position) : SV_POSITION
{
return mul(float4(position, 1.0), transform);
}
float4 PixelShaderMain() : SV_TARGET
{
return float4(1.0,1.0,1.0,1.0);
}
我的管道正确呈现,f。前任。硬编码的多维数据集,但是当我尝试从文件加载多维数据集时,会发生这种情况: distorted cube
Assimp 打开文件并加载正确数量的顶点。指数的数量似乎还可以(对于立方体,有 12 个三角形和 36 个指数)
老实说,此时我不知道我做错了什么。我是否遗漏了一些明显的东西?
提前致谢
所以我想通了。问题是在其他一些文件中我已经定义了名为 Vertex 的结构。该结构还包含 uv,因此最终我的顶点缓冲区变得一团糟。愚蠢的错误。