0

想象一下,我们有以下用 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 的快乐路径的情况下)?

4

0 回答 0