TheRedDog 2025-02-07 13:05 采纳率: 0%
浏览 6

OpenGL渲染OBJ模型时有多余图像的问题

在使用QtOpenGL加载OBJ模型时,会有多余图像,深度缓存也开了,为什么会这样
核心渲染代码:


```c++
program->setUniformValue("MVPMatrix", MVP);
program->setUniformValue("MVMatrix", MV);
program->setUniformValue("NormalMatrix", NormalMatrix);
program->setUniformValueArray("directionLightAmbi", ambients.data(), 2);
program->setUniformValueArray("DirectionLightColors", colors.data(), 2);
program->setUniformValueArray("DirectionLightDirections", diretions.data(), 2);
program->setUniformValue("DirectionLightCount", dls.count());
program->setUniformValue("EyeDirection", camera.eye - camera.center);
program->setUniformValueArray("HalfVectors", halfVectors.data(), 1);

program->setUniformValueArray("ca", ca.data(), 2, 1);
program->setUniformValueArray("la", la.data(), 2, 1);
program->setUniformValueArray("qa", qa.data(), 2, 1);
program->setUniformValueArray("PointLightColor", plcolors.data(), 2);
program->setUniformValueArray("PointLightPosition", positions.data(), 2);
program->setUniformValueArray("PointLightAmbient", plambients.data(), 2);
program->setUniformValue("PointLightCount", pls.count());
program->setUniformValue("strength", 5);

program->writeMaterial(mesh.m[i]);// 自定义的一个函数
program->setAttributeBuffer(0, GL_FLOAT, 0, 3, 0);
program->setAttributeBuffer(1, GL_FLOAT, 240 * sizeof(Data3D), 3, 0);
program->enableAttributeArray(0);
program->enableAttributeArray(1);
int j;
for (j = 0; j < mesh.vertex[i].count(); j += 240) {
    VBO.allocate(mesh.vertex[i].mid(j,240).data(),
        480 * sizeof(Data3D));
    VBO.write(240 * sizeof(Data3D),
        mesh.normals[i].mid(j,240).data(),
        240 * sizeof(Data3D));            
    glDrawArrays(GL_TRIANGLES, 0, 240);
}
if (mesh.vertex[i].count() % 240 != 0) {
    int c = mesh.vertex[i].count();
    VBO.allocate(mesh.vertex[i].mid(c/240*240, c%240).data(),
        2*(c%240) * sizeof(Data3D));
    VBO.write(c%240 * sizeof(Data3D),
        mesh.normals[i].mid(c/240*240, c%240).data(),
        c%240 * sizeof(Data3D));
    glDrawArrays(GL_TRIANGLES, 0, c%240);
}

原始模型:

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/0230d2f969c545bca5d316bfe81d59dc.png "#left")
加载,渲染后得到:

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/7f2f6a5fb01d4016aa6ede4f9434d2ab.png "#left")
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2025-02-07 13:05
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在C++中,如果在OPENGL渲染过程中遇到额外的图像和深度缓冲,可能是因为以下原因导致的:

    1. 错误处理:在OPENGL中,深度缓冲通常用于存储渲染所需的深度信息。如果在这个过程中没有正确地执行深度缓冲操作,或者深度缓冲未被正确关闭,可能导致额外的图像显示。
    2. 内存泄漏:当OPENGL程序运行时,可能会因为内存泄漏而丢失一些必要的数据。这些数据可能是由于内存映射错误、堆栈溢出或其他原因造成的。
    3. 纹理贴图问题:如果模型中的某些纹理或贴图未能正确加载到GPU上,也会造成额外的图像显示。

    为了解决这些问题,可以采取以下措施:

    1. 优化内存管理:确保在创建和销毁对象时对内存进行有效的分配和释放,避免内存泄露。

    2. 检查和修复错误:在GLSL语言中,可以通过检查GLERROR报告来发现并修复内存访问错误。例如,在GLGETERROR()函数中查看是否有内存泄漏警告。

    3. 优化深度缓冲:对于深度缓冲,建议使用专门的库(如OPENGLES)来实现深度缓冲,并确保它们被正确配置和初始化。

    4. 清理内存:在每个渲染循环结束后,清理已使用的内存,以减少不必要的内存消耗。

    5. 检查和修复错误:对于GLSL代码中可能存在的错误,应仔细检查并修正,特别是在渲染复杂模型时。

    通过上述步骤,可以有效解决在OPENGL渲染过程中出现的过多图像和深度缓冲问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月7日