gpt4 book ai didi

glsl - 有没有办法在 GLSL 中使用联合?

转载 作者:行者123 更新时间:2023-12-01 06:17:09 25 4
gpt4 key购买 nike

我想知道是否有办法在 GLSL 中使用联合。我还没有看到任何关于此的文档。如果没有,是否有使用联合的干净解决方法。

我基本上想要一些东西。这可能是两件事之一,因此我想使用联合来定义它。

谢谢!

附言可能有一些我不知道的奇怪的类型转换技巧可以做到这一点,请随时提出更好的方法。

编辑:

代码示例(无法编译,因为联合不可用):

struct A{
bool isA;
float value;
};
struct B{
bool isA;
int value;
};

/* union */
union AandB {
A a;
B b;
}

void main()
{
AandB foo;
if(foo.a.isA)
/* process on A */

else
/* process on B */
}

另外,想象一下 A 和 B 很大,你不想复制它们。

编辑 2:

这里有一些更多的信息,希望它有帮助:

这些数据将来自“外部”并且是特定于顶点的。它必须根据类型(A 或 B)进行不同的处理。它们可能是从 VBO 访问的。

最佳答案

既然我们在谈论顶点属性,你可以这样做:

layout(location = 0) vec4 floatVal;
layout(location = 0) ivec4 intVal;

OpenGL 将此称为属性别名,它是明确允许的,但有以下警告。要么仅访问一个别名属性,要么通过着色器的每个代码路径仅访问其中一个属性。因此,如果您使用 bool 条件保护访问和值计算,您会没事的:
//Don't use either variable yet

if(isFloat)
{
//Do something with `floatVal`
}
else
{
//Do something with `intVal`
}

//Don't use either variable again.

好吧,理论上你会没事的。属性别名是一个非常奇怪的极端情况,任何使用 OpenGL 的主要程序实际上都不太可能这样做。这意味着实现支持可能有问题(未使用的代码是未经测试的代码)。因此,如果您想确保您的代码真正跨平台工作,我建议您切换程序。

关于glsl - 有没有办法在 GLSL 中使用联合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39939146/

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