这个着色器是否对性能有害并且可以进行优化吗?

问题描述 投票:0回答:1

我有以下用GLSL和HLSL编写的片段着色器(这里用HLSL编写,但实现几乎完全相同):

sampler2D input : register(s0);
float3 lowerBounds : register(c0);
float3 higherBounds : register(c1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(input, uv);

    float y = clamp(0.299 * color.r + 0.587 * color.g + 0.1140 * color.b, 0.0, 1.0);
    float u = clamp(-0.169 * color.r - 0.331 * color.g + 0.5000 * color.b, 0.0, 1.0);
    float v = clamp(0.500 * color.r - 0.419 * color.g - 0.0813 * color.b, 0.0, 1.0);

    if (((y >= lowerBounds.x && y <= higherBounds.x) && (u >= lowerBounds.y && u <= higherBounds.y)) && (v >= lowerBounds.z && v <= higherBounds.z))
    {
        color = 0;
    }

    return color;
}

如您所见,着色器只检查颜色是否落在两种YUV颜色内,如果是,则过滤掉片段。

我理解条件语句可能对性能非常不利,所以我想知道上面是否是“坏”条件的一个例子和/或它可以被优化为不使用if语句。

编辑:最终优化的代码如下所示:

sampler2D input : register(s0);
float3 lowerBounds : register(c0);
float3 higherBounds : register(c1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(input, uv);

    float y = clamp(0.299 * color.r + 0.587 * color.g + 0.1140 * color.b + 0.0627, 0.0, 1.0);
    float u = clamp(-0.169 * color.r - 0.331 * color.g + 0.5000 * color.b, -0.5, 0.5);
    float v = clamp(0.500 * color.r - 0.419 * color.g - 0.0813 * color.b, -0.5, 0.5);

    float3 yuv = { y, u, v };

    // Calculate and apply mask from background range
    float3 mask = step(lowerBounds, yuv) * step(yuv, higherBounds);
    color *= 1.0 - (mask.x * mask.y * mask.z);

    return color;
}
opengl optimization glsl directx hlsl
1个回答
1
投票

我认为这段代码可以解决问题:

vec3 yuv = vec3(y, u, v);
color = step(lowerBounds, yuv ) * step(yuv, upperBounds) * color;

如果yuv <to lowerBounds,它将返回0,与yuv> = lowerBounds相同

如果upperBounds是<to yuv,它将返回0,与yuv <= upperBounds相同

© www.soinside.com 2019 - 2024. All rights reserved.