gpt4 book ai didi

opengl 着色器 (glsl) 中的 C++ 位标志

转载 作者:行者123 更新时间:2023-11-30 03:08:13 24 4
gpt4 key购买 nike

将我的位标志发送到片段着色器以便能够 if() 反对它的最佳方法是什么?

我有以下位标志(枚举):

uint32_t options;

enum Options {
ON = 1 << 0, /// row 1 | enable or disable
OFF = 1 << 1,
DUMMY1 = 1 << 2,
DUMMY2 = 1 << 3,
NONE = 1 << 4, /// row 2 | contours
SILHOUETTE = 1 << 5,
SUGGESTIVE = 1 << 6,
APPARENTRIDGES = 1 << 7,
PHOTOREALISTIC = 1 << 8, /// row 3 | shading
TONE = 1 << 9,
TONESPLASHBACK = 1 << 10,
EXAGGERATED = 1 << 11
};

对应表[] = place i,j in table([bit as int])

[1]   [2]   [4]    [8]
[16] [32] [64] [128]
[256] [512] [1024] [2048]

因此,当我的实际表中的每一行都选择了所有第一个选项时,我的位标志(选项)的可能值将为我提供 273 的值。在每一行中只能选择一个选项。

现在,当我想使用位标志检查 CPU 上启用了哪些选项时,我可以简单地执行以下操作(对于选择第一列的示例情况):

if (options & ON) {}          // true
if (options & OFF) {} // false
if (options & PHOTOREALISTIC) // true

想法是根据位标志中显示的选择执行着色器的不同部分。为此,我需要做类似的事情:

if( options == 273)
// do enable object, render with no contours and in a photorealistic manner

并跳过(在着色器中)其余被禁用的选项。但是,在理想情况下,我想使用位标志将其简化为在 CPU 上的完成方式。所以在我的着色器中,我想有一些类似的东西:

if ( (options & PHOTOREALISTIC) & (options & ON)) // true
// do stuff

有没有可能实现这样的事情。可能不是完全相同的东西,而是比简单地针对位标志产生的所有可能整数的“if()-ing ”更优雅的东西? (比如:如果(1+16+256),如果(1 + 16 + 512),...如果(8+128+2048))

最佳答案

由于您要使用不同的代码路径,因此优雅地枚举您的标志毫无意义。在 C++ 中,您可以执行类似跳转函数表的操作,但在 GLSL 中,您不能这样做(相信我——您不想这样做)。所以定期检查:

if (options & (ON | PHOTOREALISTIC)) {  /*do something*/ }

作为替代方案,如果您不受 Uber 着色器方法的约束 - 考虑从在 GLSL 对象中实现的单独功能 block 构建 GLSL 程序。

例如,一个 block 可以实现常规渲染器,而第二个 block 可以以逼真的方式实现。两者应具有相同的函数名称,在主着色器中进行外部链接并从那里调用。链接 GLSL 程序时,您只需附加符合所需行为的这些 block 之一。

关于opengl 着色器 (glsl) 中的 C++ 位标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5247957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com