【问题标题】:Why must I "use" a shader program before I can set its uniforms?为什么我必须在设置制服之前“使用”着色器程序?
【发布时间】:2017-02-21 01:59:38
【问题描述】:

我在 C++ 和 GLSL 410 中使用 OpenGL 4.5。

我最近遇到了一个问题,我试图设置着色器程序的统一变量,而没有首先使用带有glUseProgram 的着色器程序。我有一个片段着色器,它带有一个名为input_color 的统一变量(我将设置输出颜色的vec4)附加到我的shader_program。请注意,在绘制任何应该使用它的东西之前,我确实在我的主绘制循环中调用 glUseProgram(shader_program)

// set uniforms
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);

用这个程序绘制的三角形全是黑色的,不是我期望的结果。经过一些实验,我意识到我需要在设置制服之前使用该程序。

// set uniforms
glUseProgram(shader_program); // my change
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);

绘制的结果是正确颜色的三角形。

我的问题是为什么我需要先开始使用该程序?我知道 OpenGL 作为状态机工作,但在这种情况下,为什么当前着色器程序状态是必要的?毕竟,我明确地将shader_program 索引作为参数传递给glGetUniformLocation,以便获得input_color 的内存索引。

我希望这个问题的答案能帮助我更好地理解 OpenGL 中的状态,以及如何利用或管理 GPU 上表示着色器程序的内存块。

【问题讨论】:

  • "OpenGL 4.5 在 C++ 和 GLSL 410 中。" 你为什么在 GLSL 4.10 中使用 4.5?你不能使用 GLSL 4.50 吗?
  • 我一直使用的指南有点过时,所以他们指定了 4.10。我将开始使用 4.50。

标签: opengl glsl opengl-4


【解决方案1】:

您不必这样做。 GL 4.1 及更高版本为您提供glProgramUniform(),它接受您要修改的程序对象。

【讨论】:

  • 谢谢 - 我不知道这个选项存在。那么说glUniform 只知道如何通过查看“正在使用”的程序来定位内存中的程序,而glProgramUniform 具有不同程序索引的参数是否正确?
  • 是的,这就是 OpenGL 一直(历史上)拥有的“绑定使用”或“绑定修改”方法的全部意义所在。幸运的是,OpenGL 开始远离它,转而支持直接接受对象进行修改的函数。这已经在 OpenGL 4.5 中通过ARB_direct_state_access 扩展完全实现。另见khronos.org/opengl/wiki/Direct_State_Access
  • 我迟到了 3 年,但我仍然想知道作者问题的答案,我知道从 GL 4.1 及更高版本开始我们不必在修改之前使用 glUseProgram()统一,但问题仍然存在,为什么 GL 4.1 之前的版本是必需的步骤?
  • @A.Khaled:因为这就是 API 的编写方式。
  • @A.Khaled '使用程序'在这里就像'绑定纹理',只需要在处理那个 opengl 对象之前完成
猜你喜欢
  • 2012-12-22
  • 2022-07-16
  • 1970-01-01
  • 2014-05-31
  • 2013-09-21
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多