据我所知,OpenGL ES的一些现代实现优化了从统一值中获取的分支,以避免线程分歧,我对此有一些疑问。
此属性是否会转移到从统一缓冲区对象访问的结构的成员?假设我有一个统一的全局变量index
,将索引定义为与正在运行的着色器相关的结构数组,并且glDraw
调用上的所有片段都从统一块访问相同的数据并使用其中一个它是有条件分支的成员。
uniform int u_index;
struct ShaderData {
bool condition1;
bool condition2;
lowp vec2 value;
};
layout(std140) uniform u_input {
ShaderData u_data[64];
};
void main() {
ShaderData instance = u_data[u_instance];
if (instance.condition1) {
// optimized?
}
if (instance.condition1 && instance.condition2) {
// optimized?
}
if (instance.value.x > instance.value.y) {
// optimized?
}
}
注意:这个问题与Does If-statements slow down my shader?类似,但我特别关注使用统一块而不仅仅是制服的信息,以及有关基于值的创建条件的说明制服。我在询问之前已经阅读了另一个,但它没有完全回答我的问题。