0

我使用 theCherno 在他的 OpenGL 教程中提供的代码创建了两个着色器,我正在尝试渲染两个不同的“模型”。

这个项目很大,所以我会尽力包含相关的代码。这是Model::Draw()功能:

void Model::Draw(Shader shader, Camera camera)
{
    //Setting uniforms
    shader.SetUniformMat4("view", camera.GetViewMatrix());
    shader.SetUniformMat4("projection", camera.GetProjectionMatrix());
    shader.SetUniformMat4("model", m_Transform);
    m_Mesh.Draw(shader);
}

m_Mesh.Draw(shader)调用Mesh::Draw(Shader shader)

void Mesh::Draw(Shader shader) {

    shader.Bind();

    GlCall(glBindVertexArray(VAO));
    GlCall(glDrawElements(GL_TRIANGLES, (GLsizei) Indices.size(), GL_UNSIGNED_INT, 0));
    //GlCall(glBindVertexArray(0));

    //glActiveTexture(GL_TEXTURE0);
}

这是主要的渲染循环:

while (!glfwWindowShouldClose(window))
{

    simple.SetUniform3f("objColor", 1.0f, 1.0f, 1.0f);
    lightModel.Draw(simple, context.ActiveCamera);

    //Render
    shaded.SetUniform3f("objectColor", glm::vec3(1.0f));
    shaded.SetUniform3f("lightColor", glm::vec3(1.0f));
    shaded.SetUniform3f("lightPos", glm::vec3(1.0f));
    model.Draw(shaded, context.ActiveCamera);



    //OPENGL
    glfwSwapBuffers(window);
    glfwPollEvents();
}

通过使用 glGetError() 函数,我得到 Shader.Bind() 上的错误是 1281,这只是一行代码:

glUseProgram(m_RenderId);

它还打印出三个制服modelview并且perspective在着色器中不存在(这是我的着色器类所做的检查,并在glGetUniformLocation(m_RenderId, uniformName)返回时发出它-1),即使它们存在。

同样通过调试,我发现两个shader都有两个不同的m_RenderId,所以我认为那里没有问题。该错误在 while 循环第二次运行时发生。所以我可能会在抽奖结束时忘记做某事,但是通过在线查看我找不到任何东西。

奇怪的是,只有当我尝试使用两个不同的着色器渲染两个不同的网格时,它才会给我一个错误,如果我尝试使用相同的着色器渲染model网格和网格,lightModel它工作正常。

我对 OpenGL 还是很陌生,我已经尽我所能真正理解代码在做什么,但是这个错误对我来说没有意义,所以如果这是一个愚蠢的错误,我会提前原谅。如果需要更多,我可能还会在问题中遗漏一些代码片段,我会添加它。

我该如何解决?

4

0 回答 0