【问题标题】:Referring to uniforms without glGetUniformLocation引用没有 glGetUniformLocation 的制服
【发布时间】:2020-06-25 11:40:02
【问题描述】:

在我的着色器中,我喜欢使用这样的语法:

layout (location = 0) in vec3 aPos;

这样我就可以在glVertexAttribPointer 中使用索引0 等,节省glGetAttribLocation 调用的工作量。我想对uniform 值做同样的事情,但如果我这样做了

layout (location = 2) uniform float offset;

我的顶点着色器无法编译。有什么方法可以实现相同的行为而不使用glGetUniformLocation

【问题讨论】:

  • 您是否考虑过使用 UBO 代替普通制服?
  • 我对它们还不是很熟悉,它们在这里有什么好处?
  • 您可以使用std140 布局,您不必查询任何东西。您还可以通过更新频率更有效地对制服进行分组,您还可以为不同的着色器使用相同的 UBO,而不必为每个着色器单独更新制服

标签: c++ opengl glsl opengl-3 opengl-4


【解决方案1】:

OpenGL 4.3 or the ARB_explicit_uniform_location extension 允许您使用该语法在着色器中指定统一位置。因此,您的着色器 #version 需要为 430,或者您需要激活着色器中的扩展才能使用此语法。

【讨论】:

  • 哦,我明白了!如果我想针对较旧的硬件,是否必须将glGetUniformLocation 用于制服? GPU(甚至是集成的)不支持 4.3 通常有多老或多坏?
  • @memememe:这并不是真正的硬件功能;这纯粹是 API 更改。因此,扩展的可用性完全取决于驱动程序的最新程度。你想支持本身没有seen a driver update since 2013的硬件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多