c++ OpenGL闪烁问题

C++ OpenGL flickering Issues

本文关键字:问题 闪烁 OpenGL c++      更新时间:2023-10-16

我有一个问题,当我只是渲染一个立方体,这一切都很好,但如果我添加多个立方体,他们都开始闪烁。可能是因为它们相互干扰,但我使用了双重配音,所以不应该是这样。下面是渲染方法

的代码
for (std::vector<Entity *>::iterator iterator = entityArray->begin(); iterator != entityArray->end(); iterator++) {
    Entity *entity = *iterator;
    if (entity->getVertexBuffer() != NULL) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glUseProgram(entity->getVertexBuffer()->getShader()->getProgramHandle());
        glLoadIdentity();
        gluLookAt(_currentCamera->getPosition().x,
            _currentCamera->getPosition().y,
            _currentCamera->getPosition().z,
            _currentCamera->getEyeVector().x,
            _currentCamera->getEyeVector().y,
            _currentCamera->getEyeVector().z,
            _currentCamera->getUpVector().x,
            _currentCamera->getUpVector().y,
            _currentCamera->getUpVector().z);
        glTranslatef(entity->getPosition().x, entity->getPosition().y, entity->getPosition().z);
        glRotatef(entity->getRotation().x, 0.0f, 0.0f, 1.0f);
        glRotatef(entity->getRotation().y, 0.0f, 1.0f, 0.0f);
        glRotatef(entity->getRotation().z, 1.0f, 0.0f, 0.0f);
        glScalef(entity->getScale().x, entity->getScale().y, entity->getScale().z);
        glUniform4f(entity->getVertexBuffer()->getShader()->get_uColor(),
            entity->getVertexBuffer()->getShaderData()->get_uColorValue().x,
            entity->getVertexBuffer()->getShaderData()->get_uColorValue().y,
            entity->getVertexBuffer()->getShaderData()->get_uColorValue().z,
            entity->getVertexBuffer()->getShaderData()->get_uColorValue().w);
        glUniform3f(entity->getVertexBuffer()->getShader()->get_uLightPosition(),
            entity->getVertexBuffer()->getShaderData()->get_uLightPosition().x,
            entity->getVertexBuffer()->getShaderData()->get_uLightPosition().y,
            entity->getVertexBuffer()->getShaderData()->get_uLightPosition().z);

        entity->getVertexBuffer()->configureVertexAttributes();
        entity->getVertexBuffer()->renderVertexBuffer();
        glfwSwapBuffers(_window);
        glfwPollEvents();
    }
}

首先清除,绘制所有立方体,然后交换,像这样:

glClear();
for (cube in cubes) { draw(cube); }
glfwSwapBuffers(_window);
glfwPollEvents();

那就解决了

你在内部循环中调用glClear和glSwapBuffers。因此,对于你在内部循环中绘制的所有内容,它都会清除图片,绘制物体(单个立方体)交换,然后对数组中的下一个元素执行相同的操作。

所有不绘制立方体的元素都必须在循环之外。