什么是 OpenGL 中的 "active" 统一块
What is an "active" uniform block in OpenGL
OpenGL documentation 不是很清楚什么是 active 统一块(相对于那些不活动的)。所以我的理解是它们是 referenced/used 在着色器程序中......或者是!
考虑以下着色器程序:
顶点着色器
#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;
}
即使我不使用 foo
或 dog
统一块,查询以获取活动统一块的数量...
GLint count = 0;
glGetProgramiv(program, GL_ACTIVE_UNIFORM_BLOCKS, &count);
for (auto i = 0; i < count; ++i) {
...
}
...对于这个着色器程序总是returns 3。无论我在 Android、iOS 或 WebGL2 上 运行,我都会得到相同的结果。我没有在 desktop OpenGL(相对于 OpenGL ES 3.0)上进行测试,但我不希望有不同的结果(但我想它可以吗?)。
- 那么统一块激活是什么意思呢?
- 有没有办法只检索已用个统一块(跳过未使用的块)?
谢谢!
未使用的统一块可能会被实现优化掉。但它可能不会;这完全取决于实施。 OpenGL 不要求 实施来优化未使用的制服或块;它只是允许可能性。
无法保证获取正在使用的统一块。
OpenGL documentation 不是很清楚什么是 active 统一块(相对于那些不活动的)。所以我的理解是它们是 referenced/used 在着色器程序中......或者是!
考虑以下着色器程序:
顶点着色器
#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;
}
即使我不使用 foo
或 dog
统一块,查询以获取活动统一块的数量...
GLint count = 0;
glGetProgramiv(program, GL_ACTIVE_UNIFORM_BLOCKS, &count);
for (auto i = 0; i < count; ++i) {
...
}
...对于这个着色器程序总是returns 3。无论我在 Android、iOS 或 WebGL2 上 运行,我都会得到相同的结果。我没有在 desktop OpenGL(相对于 OpenGL ES 3.0)上进行测试,但我不希望有不同的结果(但我想它可以吗?)。
- 那么统一块激活是什么意思呢?
- 有没有办法只检索已用个统一块(跳过未使用的块)?
谢谢!
未使用的统一块可能会被实现优化掉。但它可能不会;这完全取决于实施。 OpenGL 不要求 实施来优化未使用的制服或块;它只是允许可能性。
无法保证获取正在使用的统一块。