Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 被遗弃的助理未正确加载网格?(可能是索引缓冲区)_Opengl_D_Mesh_Assimp_Derelict3 - Fatal编程技术网

Opengl 被遗弃的助理未正确加载网格?(可能是索引缓冲区)

Opengl 被遗弃的助理未正确加载网格?(可能是索引缓冲区),opengl,d,mesh,assimp,derelict3,Opengl,D,Mesh,Assimp,Derelict3,我编写了一个定制的OBJ文件导入程序,它工作得相当好 然而,它的健壮性不足以支持一切。我已经决定了 给阿西姆打一针。我学习了一些教程,并设置了 我的代码读取顶点、tex坐标、法线和索引 我已经成功地用我的 海关进口商。立方体模型的面无法正确渲染, 取而代之的是只渲染立方体的几个三角形。道路助理 处理数据显然与我的解决方案有点不同 因为法线、位置/顶点、纹理坐标和索引 与我的自定义解决方案不匹配。我将非常感激 了解我在所有教程中遇到问题的原因 我发现他们符合我的方法。如果一张照片有问题 渲染的立方

我编写了一个定制的OBJ文件导入程序,它工作得相当好 然而,它的健壮性不足以支持一切。我已经决定了 给阿西姆打一针。我学习了一些教程,并设置了 我的代码读取顶点、tex坐标、法线和索引 我已经成功地用我的 海关进口商。立方体模型的面无法正确渲染, 取而代之的是只渲染立方体的几个三角形。道路助理 处理数据显然与我的解决方案有点不同 因为法线、位置/顶点、纹理坐标和索引 与我的自定义解决方案不匹配。我将非常感激 了解我在所有教程中遇到问题的原因 我发现他们符合我的方法。如果一张照片有问题 渲染的立方体会很有帮助,我可以做一个屏幕截图 向上的多谢各位

我的资产导入类别:

module graphics.assimp;

import std.stdio, std.container, std.range;
import core, graphics;
import derelict.assimp3.assimp;

class AssImp
{
    this()
    {
        DerelictASSIMP3.load();
    }
    IndexedModel makeIndexedModel(vec3[] verts, vec3[] norms, vec2[] uvs, uint[] indices)
    {
        IndexedModel model;
        model.pos = verts;
        model.normals = norms;
        model.texCoords = uvs;
        model.indices = indices;

        writeln("verts: ", model.pos);
        writeln("normals: ", model.normals);
        writeln("texCoords: ", model.texCoords);
        writeln("indices: ", model.indices);

        return model;
    }
    Mesh loadMesh(const char* fileName)
    {
        const aiScene* scene = aiImportFile(fileName, aiProcessPreset_TargetRealtime_Fast | aiProcess_Triangulate | aiProcess_JoinIdenticalVertices);
        const aiMesh* mesh = scene.mMeshes[0];

        numVerts = mesh.mNumFaces * 3;

        vertArray = new vec3[mesh.mNumFaces];
        normalArray = new vec3[mesh.mNumFaces];
        uvArray = new vec2[mesh.mNumFaces];
        int indexCount;
        for (uint i = 0; i < mesh.mNumFaces; i++)
        {
            const aiFace face = mesh.mFaces[i];
            indexCount += face.mNumIndices;

            for (int j = 0; j < 3; j++)
            {
                aiVector3D uv = mesh.mTextureCoords[0][face.mIndices[j]];
                uvArray[i] = vec2(uv.x, uv.y);

                aiVector3D normal = mesh.mNormals[face.mIndices[j]];
                normalArray[i] = vec3(normal.x, normal.y, normal.z);

                aiVector3D pos = mesh.mVertices[face.mIndices[j]];
                vertArray[i] = vec3(pos.x, pos.y, pos.z);

                indices.insert(face.mIndices[j]);
            }
        }
        return new Mesh(makeIndexedModel(vertArray, normalArray, uvArray, indices.array));      
    }
private:
    vec3 vertArray[];
    vec3 normalArray[];
    vec2 uvArray[];
    auto indices = make!(Array!uint)();
    int numVerts;
}
modulegraphics.assimp;
进口标准集装箱,标准范围;
导入核心、图形;
导入废弃的.assimp3.assimp;
班级助理
{
这()
{
丢弃的simp3.load();
}
IndexedModel makeIndexedModel(vec3[]顶点,vec3[]范数,vec2[]UV,uint[]索引)
{
指数模型;
model.pos=顶点;
model.normals=范数;
model.texCoords=uvs;
模型指数=指数;
writeln(“verts:”,model.pos);
writeln(“法线:”,model.normals);
writeln(“texCoords:”,model.texCoords);
写入(“索引:”,模型索引);
收益模型;
}
网格加载网格(常量字符*文件名)
{
const aiScene*scene=aiImportFile(文件名,aiProcessPreset_TargetRealtime_Fast | aiProcess_Triangulate | aiProcess_joinidenticalveartices);
const aiMesh*mesh=scene.mmesh[0];
numVerts=mesh.mNumFaces*3;
vertArray=新的vec3[mesh.mNumFaces];
normalArray=新的vec3[mesh.mNumFaces];
uvArray=new vec2[mesh.mNumFaces];
int indexCount;
对于(uint i=0;i
我的其余代码位于(Mesh类位于源代码/图形中):
我不知道
D
,所以我只对您的
assimp
用法发表评论

使用更多预处理选项如何:

aiProcess_SortByPType |
aiProcess_RemoveRedundantMaterials |
aiProcess_PreTransformVertices |
aiProcess_GenUVCoords |
aiProcess_OptimizeMeshes |
aiProcess_OptimizeGraph
对于
.obj
文件,这可能没有那么有用,但如果您想读取其他格式,它将在以后变得更有用

对于简单的
.obj
文件,这可能就足够了:

const aiMesh* mesh = scene.mMeshes[0];
但有时它会选择错误的网格,因此您应该使用
aiNode*
scene.mRootNode
开始递归迭代到
scene.mNumChildren

我100%确定
mesh.mNumFaces
不是顶点数组的大小。 你可以看看我的C++代码,我相信你会理解逻辑的。
aiMesh *ptr = nullptr; // Set to mesh you want to process
QVector<float> outVertices, outUVs, outNormals;
QVector<uint> outIndices;


qDebug() << "Mesh name: " << ptr->mName.C_Str();
const uint n_vertices = ptr->mNumVertices;
qDebug() << "Num vertices: " << n_vertices;


outVertices.resize(n_vertices * 3);
float * data = reinterpret_cast<float*>(ptr->mVertices);
copy_n(data, outVertices.size(), outVertices.data());

outUVs.resize(n_vertices * 2);
for(uint i = 0; i < n_vertices; i++)
{
    aiVector3D & vec = ptr->mTextureCoords[0][i];
    outUVs[i*2] = vec.x;
    outUVs[i*2+1] = vec.y;
}

outNormals.resize(n_vertices * 3);
data = reinterpret_cast<float*>(ptr->mNormals);
copy_n(data, outNormals.size(), outNormals.data());


for(uint i = 0; i < ptr->mNumFaces; i++)
{
    aiFace face = ptr->mFaces[i];
    const uint n_indices = face.mNumIndices;
    const uint current_size = outIndices.size();

    outIndices.resize(current_size + n_indices);
    copy_n(face.mIndices, n_indices, outIndices.data() + current_size);
}
aiMesh*ptr=nullptr;//设置为要处理的网格
QVector输出顶点、输出UV、输出法线;
QVector;
qDebug()多个顶点;
qDebug()mTextureCoords[0][i];
outUVs[i*2]=vec.x;
outUVs[i*2+1]=vec.y;
}
调整大小(n_个顶点*3);
数据=重新解释铸件(ptr->mNormals);
复制(数据,outNormals.size(),outNormals.data());
对于(uint i=0;imNumFaces;i++)
{
aiFace=ptr->mFaces[i];
consuint n_索引=face.mNumIndices;
consuint current_size=outIndices.size();
调整大小(当前大小+n个索引);
复制(face.mIndices、n_索引、outidices.data()+当前大小);
}
QVector
s这里是
float
的平面数组,因此当您使用
vec3
vec2
时,代码有点不可压缩