【问题标题】:What is an "active" uniform block in OpenGL什么是 OpenGL 中的“活动”统一块
【发布时间】:2017-06-09 03:30:45
【问题描述】:

OpenGL documentation 不太清楚什么是活动 统一块(相对于那些不活动的块)。所以我的理解是它们在着色器程序中被引用/使用......或者是它!

考虑以下着色器程序:

顶点着色器

#version 300 es
precision highp float;

layout(std140) uniform globals
{
    mat4 world_view_proj;
};

layout(std140) uniform foo
{
    vec3 bar;
};

layout(std140) uniform dog
{
    vec3 cat;
};

layout(location = 0) in vec4 position0;
layout(location = 4) in lowp vec4 color0;
out lowp vec4 v_color;

void main ( )
{
    v_color = color0;
    gl_Position = position0 * world_view_proj;
}

片段着色器

#version 300 es
precision highp float;

in lowp vec4 v_color;
layout(location = 0) out lowp vec4 frag_color;

void main()
{
    frag_color = v_color;
}

即使我不使用foodog 统一块,查询以获取活动统一块的数量...

GLint count = 0;
glGetProgramiv(program, GL_ACTIVE_UNIFORM_BLOCKS, &count);
for (auto i = 0; i < count; ++i) {
    ...
}

...对于这个着色器程序总是返回 3。无论我在 Android、iOS 还是 WebGL2 上运行,我都会得到相同的结果。我还没有在 desktop OpenGL(相对于 OpenGL ES 3.0)上进行测试,但我不希望有不同的结果(但我想它可以?)。

  1. 那么,统一块活动意味着什么?
  2. 有没有办法只检索使用过的个统一块(跳过未使用的块)?

谢谢!

【问题讨论】:

  • 如果您使用的是 webgl2,您应该引用 OpenGL 文档。您应该引用OpenGL ES specreference pages。请注意,不能保证参考页面是正确的,因此如有疑问,请始终参考规范

标签: android ios opengl-es webgl2


【解决方案1】:

未使用的统一块可以通过实现进行优化。但它也可能不是;这完全取决于实施。 OpenGL 不要求 实现来优化未使用的制服或块;它只是考虑到了这种可能性。

无法保证获取正在使用的统一块。

【讨论】:

  • 在任何地方是否有任何参考说明实施不需要这样做?
  • @Deathicon:规范中没有任何内容表明它必需的。因此,它不是必需的。您在规范中得到的最接近的是“任何接口的活动资源集都是依赖于实现的,因为它取决于编译器和链接器执行的各种分析和优化。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多