我的片段上的布尔逻辑需要大量的VRAM,我该如何避免这种情况?

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

我有一个来自GLSL 330的非常简单的请求:

if (colorOut.r <= 1.0 && colorOut.r > 0.7)
{
    colorOut.r=*color_1.r;
}

我有40多个这样的比较。

然而,这给我带来了一个麻烦的世界,因为我被告知AND,NOT等声明会占用大量的视频内存,而我正在为After Effects开发一个插件,而碰巧使用它们的人则不会没有强大的GPU(大多数情况下 - 我做过调查,大多数都使用移动版的中端GPU)。所以我想我会问你们是否有可能替代使用AND或者甚至是,因为我被告知片段着色器不喜欢在主分支中。

谢谢。

opengl glsl fragment-shader
1个回答
0
投票

像您这样的多路复用场景,您可以使用无分支编程。例如,你可以使用这样的东西。布尔运算符是“近似的”。

colorOut.r = mix(colorOut.r, (colorOut.r*color_1.r), 
    ( clamp(pow(1-colorOut.r, 20), 0, 1)
    * clamp(pow(colorOut.r-0.7, 20), 0, 1) ) );

请注意,三元组通常不会导致太多问题,这在资源上应该很容易,因为它不会导致分支分叉:

colorOut.r = mix(colorOut.r, (colorOut.r*color_1.r), 
    ( colorOut.r <= 1 && colorOut.r > 0.7 ? 1 : 0 );
© www.soinside.com 2019 - 2024. All rights reserved.