OpenGL没有正确切换着色器?

时间:2014-12-08 19:18:56

标签: opengl shader

所以,我现在在我的程序中正在努力使用着色器。基本上这是主循环:

heightmap_shader.use();
nanosuit_shader.use();

glm::mat4 nanosuitProj, nanosuitModel, nanosuitView;
nanosuitProj = glm::perspective(glm::radians(45.0f), float(800/600), 0.1f, 1000.0f);
nanosuitView = camera.getViewMatrix();
glUniformMatrix4fv(glGetUniformLocation(nanosuit_shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(nanosuitProj));
glUniformMatrix4fv(glGetUniformLocation(nanosuit_shader.getProgramID(), "view"), 1, GL_FALSE, glm::value_ptr(nanosuitView));

// Draw the loaded model
nanosuitModel = glm::translate(nanosuitModel, glm::vec3(0.0f, 2.0f, 0.0f)); // Translate it down a bit so it's at the center of the scene
nanosuitModel = glm::scale(nanosuitModel, glm::vec3(0.05f, 0.05f, 0.05f));  // It's a bit too big for our scene, so scale it down
glUniformMatrix4fv(glGetUniformLocation(nanosuit_shader.getProgramID(), "model"), 1, GL_FALSE, glm::value_ptr(nanosuitModel));

nanosuit_Model.Draw(nanosuit_shader);

glfwSwapBuffers(window);

所以基本上我首先使用着色器(高度图)但不做任何事情。之后我改为实际必要的着色器,然后绘制对象。 这不起作用。屏幕是空的。

如果我发表评论

heightmap_shader.use()

程序运行正常。有人可以解释一下吗?我做错了吗?

在我的脑海中,程序应该与第一个着色器一起工作,因为我每次都要切换它。但似乎我的程序不理解它。

注意:方法use()是:

glUseProgram(shaderId)

其中shaderId是编译后着色器的id。

编辑:

只是想说这应该工作,并且因为我的Shader类中存在错误而无法正常工作。

1 个答案:

答案 0 :(得分:1)

有可能是切换着色器而其他错误。有一个空白的屏幕可能意味着一个(或多个)像10个不同的东西。如:

  1. 您的对象已关闭屏幕。对我来说最常见的是z轴错误。
  2. 您没有正确传递属性或制服。
  3. 纹理没有正确加载。
  4. 您的着色器代码中存在一个您无法捕获的错误。
  5. (5-10)您的代码中的其他内容我也不知情。就像你管理对象的方式,你如何加载3d对象,你如何处理转换,你的视图或投影矩阵等。
  6. 我的第一个测试总是将片段颜色设置为特定的东西。喜欢设置:

    gl_FragColor = vec4(1.0,0.0,0.0,1.0); // red

    要查看您正在使用的着色器,如果您认为当您要求将上述内容放在一个中时它可能没有切换着色器,并且:

    gl_FragColor = vec4(0.0,1.0,0.0,1.0); // green

    在另一个中,看看对象是哪种颜色。

    当我开始使用着色器时遇到问题时,我尽可能简化。注释掉代码或只是硬编码gl_FragColor。首先是纯色,然后当你努力工作时将它编码为你想要看到的变量。

    如果您无法gl_FragColor =红色将屏幕上的对象显示为红色,则表示您还有其他问题。