opengl - 这个着色器有条件对性能不利吗?可以优化吗?
问题描述
我有以下用 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;
}
解决方案
我认为这段代码应该可以解决问题:
vec3 yuv = vec3(y, u, v);
color = step(lowerBounds, yuv ) * step(yuv, upperBounds) * color;
如果 yuv < to lowerBounds 它将返回 0 与 yuv >= lowerBounds 相同
如果 upperBounds < 到 yuv 它将返回 0 与 yuv <= upperBounds 相同
推荐阅读
- jquery - 由于值中的双引号,Jquery 中的 JSON.parse 出错
- javascript - 生命周期方法中没有的副作用
- c++ - 是什么让 unorder_map 和 unorder_set 比 map 和 set 更快?
- javascript - 单击取消按钮时如何消除错误
- elasticsearch - Elasticsearch 批量 API
- apache-spark - 火花选项的文档
- python - 通过包含特定字符串从文件中删除行在python中不起作用
- reactjs - VSCode 键绑定导航到渲染方法
- flutter - Flutter:如何从 Uint8List 播放视频
- android - Android如何在api 24下以编程方式执行单击,长按和滑动操作(从左到右,从右到左,从下到上,从上到下)