我使用 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);
它还打印出三个制服model,view并且perspective在着色器中不存在(这是我的着色器类所做的检查,并在glGetUniformLocation(m_RenderId, uniformName)返回时发出它-1),即使它们存在。
同样通过调试,我发现两个shader都有两个不同的m_RenderId,所以我认为那里没有问题。该错误在 while 循环第二次运行时发生。所以我可能会在抽奖结束时忘记做某事,但是通过在线查看我找不到任何东西。
奇怪的是,只有当我尝试使用两个不同的着色器渲染两个不同的网格时,它才会给我一个错误,如果我尝试使用相同的着色器渲染model网格和网格,lightModel它工作正常。
我对 OpenGL 还是很陌生,我已经尽我所能真正理解代码在做什么,但是这个错误对我来说没有意义,所以如果这是一个愚蠢的错误,我会提前原谅。如果需要更多,我可能还会在问题中遗漏一些代码片段,我会添加它。
我该如何解决?