c++ 顶点位置未在OpenGL中正确导入/正确绘制[关闭]

lsmepo6l  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(81)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
6天前关闭
截至4天前,社区正在审查是否重新开放此问题。
Improve this question
我最近尝试在我的OpenGL应用程序中导入一个网格时遇到了一个问题。网格导入成功,但是在渲染时它看起来完全变形了。在我看来,网格的顶点位置没有正确加载。下面是问题的图像。**注意:**这里导入的.obj是Blender的默认猴子网格。可以看出,网格的 * 一般轮廓 * 保持不变,但是,它完全偏离了目标。

我不能在这里问最好的问题,因为我似乎不能确定代码在哪一点失败。没有构建或运行时错误。然而,我最好的猜测是代码在加载网格时失败。下面的代码是加载器函数。

bool Loader::LoadObject(
    std::string objectFP,
    std::vector<glm::vec3>& VBD,
    std::vector<glm::vec2>& UVBD,
    std::vector<glm::vec3>& NBD,
    std::vector<unsigned int>& IBD
)
{
    Helpers::Log(LOG, "Loading object (" + objectFP + ")...");

    std::vector<glm::vec3> VertexData;
    std::vector<glm::vec2> UVData;
    std::vector<glm::vec3> NormalData;

    FILE* file = fopen(objectFP.c_str(), "r");

    if (file == 0)
    {
        Helpers::Error(ERR, L"Failed to load object.");
        
        return false;
    }
    else
    {
        while (true)
        {
            char lineHeader[128] = { 0 };

            int res = fscanf(file, "%s", lineHeader);

            /* RUN CHECKS */

                            // End of File (EOF)
            if (res == EOF)
            {
                break;
            }
            else
            {
                if (res <= 0)
                {
                    Helpers::Error(ERR, L"(RES) Failed to load object.");
                    break;
                }
                else
                {
                    if (strcmp(lineHeader, "v") == 0)
                    {
                        glm::vec3 vertex = glm::vec3(0.0f, 0.0f, 0.0f);
                        // Return value is not needed here, just to get rid of the warning
                        int out = fscanf(file, "%f %f %f\n", &vertex.x, &vertex.y, &vertex.z);
                        VertexData.push_back(vertex);
                    }
                    else if (strcmp(lineHeader, "vt") == 0)
                    {
                        glm::vec2 uv = glm::vec2(0.0f, 0.0f);
                        int out = fscanf(file, "%f %f\n", &uv.x, &uv.y);
                        UVData.push_back(uv);
                    }
                    else if (strcmp(lineHeader, "vn") == 0)
                    {
                        glm::vec3 normal = glm::vec3(0.0f, 0.0f, 0.0f);
                        int out = fscanf(file, "%f %f %f\n", &normal.x, &normal.y, &normal.z);
                        NormalData.push_back(normal);
                    }
                    else
                    {
                        char fillBuffer[1000];
                        fgets(fillBuffer, 100, file);
                    }

                    VBD.reserve(VertexData.size());
                    UVBD.reserve(UVData.size());
                    NBD.reserve(NormalData.size());

                    for (unsigned int i = 0; i < VertexData.size(); i++)
                    {
                        VBD.push_back(VertexData[i]);
                    }
                    for (unsigned int i = 0; i < UVData.size(); i++)
                    {
                        UVBD.push_back(UVData[i]);
                    }
                    for (unsigned int i = 0; i < NormalData.size(); i++)
                    {
                        NBD.push_back(NormalData[i]);
                    }
                }
            }
        }

        ComputeIndexBuffer(VBD, IBD);

        fclose(file);
        return true;
    }
}

如果这是不是的问题。源代码是公开的here
着色器也可能有问题。

ippsafx7

ippsafx71#

我从你的仓库检查了你的monkey.obj,正如我所怀疑的,你的网格没有三角化。当从blender导出时。选中下面所示的Triangulated Mesh框,将你的网格从多边形转换为三角形,因为你在导入器中将面解释为三角形。

ComputeIndexBuffer()函数中:

void Loader::ComputeIndexBuffer(std::vector<glm::vec3> VBD, std::vector<unsigned int>& IBD)
{
    for (unsigned int i = 0; i < VBD.size() / 3; i++)
    {
        unsigned int i1 = i * 3;
        unsigned int i2 = i * 3 + 1;
        unsigned int i3 = i * 3 + 2;

        IBD.push_back(i1);
        IBD.push_back(i2);
        IBD.push_back(i3);
    }
}

你是假设那面孔是三角形,while monkey.obj文件contains mainly quads and therefore the incorrect rendering.为处理n-gons,你必须改进你的进口商或诉诸使用专用进口商象assimp
编辑:为了进一步澄清,我将显示您的'monkey.obj'和三角形的行:
在下面的行中:

f 505/553/499 323/353/499 321/349/499 391/427/499

这是你的monkey.obj的最后一条线,一个面被定义(f在线的开始)有4个顶点(即一个四边形),每个顶点包含有关位置/uv坐标/法线的信息;而三角化的一个将具有如下定义的所有面:

f 505/553/942 323/353/942 321/349/942

正如你所看到的,有三个/组,因此有三个顶点,因此有一个triangle

相关问题