【问题标题】:OpenGL not switching shaders correctly?OpenGL没有正确切换着色器?
【发布时间】:2014-12-09 03:39:42
【问题描述】:

所以,我现在在我的程序中与着色器作斗争。基本上这是主循环:

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是shader编译后的id。

编辑:

只想说这应该可以工作,但它没有工作,因为我的 Shader 类中有一个错误。

【问题讨论】:

  • “着色器类中的错误”在我的列表中的 #5-10 中。这是“等”。 :)

标签: opengl shader


【解决方案1】:

有可能是在切换着色器而其他问题。空白屏幕可能意味着 10 种不同事物中的一种(或多种)。如:

  1. 您的对象不在屏幕上。对我来说最常见的是 z 轴是错误的。
  2. 您没有正确传递属性或制服。
  3. 纹理未正确加载。
  4. 您的着色器代码中有一个您没有发现的错误。
  5. (5-10) 你的代码中我也不知道的其他内容。比如您如何管理对象、如何加载 3d 对象、如何处理变换、您的视图或投影矩阵等。

我的第一个测试总是将片段颜色设置为特定的东西。喜欢设置:

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 = red 将您的对象在屏幕上显示为纯红色,那么您还有其他问题。

【讨论】:

  • 感谢您的提示,我实际上发现我的着色器类无法正常工作。现在我使用的是不同的类,它工作正常。
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2012-06-20
  • 2015-05-09
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多