想象一下,我们有以下用 GLSL 编写的片段着色器,它将为 Vulkan 编译:
//Vertex I/O
layout(location = 0) in vec2 ex_texCoord;
layout(location = 0) out vec4 out_color;
//Uniform buffers
layout(set = 0, binding = 0) uniform sampler2D sampler;
layout(set = 0, binding = 1) uniform UniformBlock{
mat4 ycbcr2rgbMtx;
};
void main() {
vec4 sample = texture(sampler, ex_texCoord);
out_color = ycbcr2rgbMtx*sample;
}
如所见,对每个片段执行矩阵乘法。但是,有时该矩阵可能是恒等的,因此操作变得透明。我的问题是是否值得努力编写一个允许绕过矩阵乘法的统一值。乍一看,这似乎是一个明显的优化,但我不确定,因为 GPU 在矩阵运算方面非常快,并且跳转通常会降低性能。这是上面改编的代码:
//Vertex I/O
layout(location = 0) in vec2 ex_texCoord;
layout(location = 0) out vec4 out_color;
//Uniform buffers
layout(set = 0, binding = 0) uniform sampler2D sampler;
layout(set = 0, binding = 1) uniform UniformBlock{
mat4 ycbcr2rgbMtx;
int isRgb;
};
void main() {
vec4 sample = texture(sampler, ex_texCoord);
if(!isRgb) {
sample = ycbcr2rgbMtx*sample;
}
out_color = sample;
}
PD:我问的是笼统的说法,不管特定的 GPU 品牌或架构如何。
编辑:据我所知,前一个需要 4 个 GPU 周期。后一个是否只需要一个 GPU 周期(在 isRgb=true 的快乐路径的情况下)?