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
C++ OpenGL模型在一段时间内呈现良好,然后在随机时间后呈现稀疏_C++_Opengl_Sdl_Glm Math - Fatal编程技术网

C++ OpenGL模型在一段时间内呈现良好,然后在随机时间后呈现稀疏

C++ OpenGL模型在一段时间内呈现良好,然后在随机时间后呈现稀疏,c++,opengl,sdl,glm-math,C++,Opengl,Sdl,Glm Math,我拼凑了一个OpenGL示例,发现了一个问题。我可以正确加载和渲染模型。但是,几秒钟后,模型将停止正确渲染 编辑:从正常到坏的变化发生在随机数秒后,并立即发生。一旦坏了,就再也不会变回来。 EventLoop::Start()函数现在所做的就是阻塞并在循环中调用回调,直到isRunning为false。 以下是模型出现问题之前的样子: 以下是几秒钟后的情况: 这是我的密码: // nasty globals static Camera* camera; static ModelData dr

我拼凑了一个OpenGL示例,发现了一个问题。我可以正确加载和渲染模型。但是,几秒钟后,模型将停止正确渲染

编辑:从正常到坏的变化发生在随机数秒后,并立即发生。一旦坏了,就再也不会变回来。

EventLoop::Start()函数现在所做的就是阻塞并在循环中调用回调,直到isRunning为false。

以下是模型出现问题之前的样子:

以下是几秒钟后的情况:

这是我的密码:

// nasty globals
static Camera* camera;
static ModelData dragonModel;
static ShaderProgram program;

using namespace std;

// called by an event loop class until isRunning is false
void callback(bool *isRunning)
{
        SDL_Event event;
        while(SDL_PollEvent(&event))
        {
            // update the camera position
            switch(event.type)
            {
            case SDL_QUIT:
                *isRunning = false;
                SDL_Quit();
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                case SDLK_UP:
                    camera->MoveBy(glm::vec3(0, 1, 0));
                    break;
                case SDLK_DOWN:
                    camera->MoveBy(glm::vec3(0, -1, 0));
                    break;
                case SDLK_RIGHT:
                    camera->MoveBy(glm::vec3(1, 0, 0));
                    break;
                case SDLK_LEFT:
                    camera->MoveBy(glm::vec3(-1, 0, 0));
                    break;
                case SDLK_w:
                    camera->MoveTo(glm::vec3(0, 0, -5));
                    break;
                case SDLK_s:
                    camera->MoveTo(glm::vec3(0, 0, 5));
                    break;
                default:
                    break;
                }
            default:
                break;
            }

        }

    // calc matrices
    glm::mat4 scale = glm::scale(glm::mat4(), glm::vec3(1, 1, 1));
    glm::mat4 model = scale * glm::mat4(1.0);
    glm::mat4 MVP = DisplayManager::GetProjectionMatrix() * model;

    // send the final matrix over
    GLuint MVPLoc = glGetUniformLocation(program.id, "MVP");
    glUniformMatrix4fv(MVPLoc, 1, GL_FALSE, glm::value_ptr(MVP));

    // clear and draw
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawElements(GL_TRIANGLES, dragonModel.num_indices, GL_UNSIGNED_INT, NULL);

    DisplayManager::Swap(); // SDL_GL_SwapWindow()
}

#undef main
int main(void)
{
    // create a display and get the camera
    DisplayManager::Create("yay", 800, 600);
    camera = DisplayManager::GetCamera();
    glClearColor(0, 0, 0, 1);
    DisplayManager::Swap();

    // load the dragon model
    load_model(&dragonModel, "dragon.obj");

    // load the shader program
    program = ShaderManager::LoadProgram("basicShader.vert", "basicShader.frag");
    ShaderManager::SetCurrentProgram(program);

    if(!IsValidProgram(program))
    {
        printf("\ninvalid program detected\n");
    }

    // set up the model's VAO and leave it bound
    glEnable(GL_DEPTH_TEST);
    glCullFace(GL_BACK);

    GLuint dragonVAO = -1;
    GLuint VBO = -1;
    GLuint EBO = -1;
    glGenVertexArrays(1, &dragonVAO);
    glBindVertexArray(dragonVAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, dragonModel.num_vertices * 3 * sizeof(GLfloat), dragonModel.vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, dragonModel.num_indices * sizeof(GLuint), dragonModel.indices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0);
    glEnableVertexAttribArray(0);

    // free the model because we don't need our copy
    free_model(&dragonModel);

    // start the event loop
    EventLoop eventLoop;
    eventLoop.SetLoopCallback(&callback);
    eventLoop.Start();

    return 0;
}
以下是我的着色器:

基本Shader.vert

#version 330
uniform mat4 MVP;
layout(location = 0) in vec3 in_position;
out vec4 passed_color;
void main(void)
{
    gl_Position = MVP * vec4(in_position, 1.0f);
    passed_color = vec4(normalize(in_position), 1.0f);
}
巴斯克夏德

#version 330

in vec4 passed_color;

void main(void)
{
    gl_FragColor = passed_color;
}
我尝试过的:

  • 更新驱动程序
  • 确保索引的数量在 搞砸了
我看不到任何模型数据的更新或绘图调用的更改会导致这种情况发生。我怀疑GLD元素、glClear、我的矩阵更新以及我的上下文的创建:

void DisplayManager::Create(const char *title, int width, int height)
{
    SDL_Init(SDL_INIT_VIDEO);
    camera_ = new Camera();

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);


    window_ = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
    glContext_ = SDL_GL_CreateContext(window_);

    SDL_GL_MakeCurrent(window_, glContext_);
    SDL_GL_SetSwapInterval(1);

    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
    if(err != GLEW_OK)
    {
        printf("glew failed to init: %s", glewGetErrorString(err));
    }
}

AMD游戏不断发展

有一次,在渲染立方体时,“打开”和“保存高光-Ctrl F2”出现在屏幕的左上角。显然,这是一个屏幕捕捉的东西从AMD游戏演变而来。恰好我的渲染在消息出现的同时出现了问题

我终止了“Raptr桌面”进程,我的模型现在可以正确渲染了

我已经通知AMD并卸载了该程序


这真是太滑稽了,我花了好几天的时间盯着我的代码,试图找出错误:)

AMD游戏已经进化了

有一次,在渲染立方体时,“打开”和“保存高光-Ctrl F2”出现在屏幕的左上角。显然,这是一个屏幕捕捉的东西从AMD游戏演变而来。恰好我的渲染在消息出现的同时出现了问题

我终止了“Raptr桌面”进程,我的模型现在可以正确渲染了

我已经通知AMD并卸载了该程序


这真是太滑稽了,我花了好几天的时间盯着我的代码,试图找出错误:)

如果你还没有清除每一帧的颜色和深度缓冲区,那就试试吧。我是。它是通过“//清除并绘制”注释完成的。您是否在您看到问题所在的计算机之外的计算机上尝试过此操作?不,如果我无法修复它,那么我会修复它,但这将非常繁琐。尝试提高精度了吗?尝试清除每帧的颜色和深度缓冲区,如果您还没有。我是。它是通过“//清除并绘制”注释完成的。您是否在您看到问题所在的计算机之外的其他计算机上尝试过此操作?不,如果我无法修复它,我会的,但这将非常乏味。是否尝试提高精度?