opengl GLSL中是否有一个内置的AND函数,或者是否有一些优化的方法来执行组件方面的AND?

lc8prwob  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(104)

GLSL具有lessThangreaterThan等的组件式函数,这些函数返回bvec
也有any()all(),但似乎没有and()
如果我有两个bvec3,并且需要一个新的bvec3,则等效于:

bvec3 new = bvec3(two.x && one.x, two.y && one.y, two.z && one.z);

是否有更快或更优化的方法来实现这一点?
我正在尝试编写高度优化的GLSL代码。

5ktev3wc

5ktev3wc1#

我不确定这样做是否更有效,但我相信您可以通过将两个bvec3值转换为另一个向量类型(如uvec3vec3)来执行and,对这些类型使用更广泛的操作(如按位与、乘法),然后再转换回来。
对于bvec3onetwo,有以下几个选项:

bvec3(uvec3(one) & uvec3(two))
bvec3(uvec3(one) * uvec3(two))
bvec3(vec3(one) * vec3(two))

在使用这个表达式之前,你一定要进行基准测试。组件式表达式很有可能更快。

mpgws1up

mpgws1up2#

在Nvidia GPU上,你可以只写bvec3 new = two && one;
说明书在这一点上很混乱。它说
逻辑二元运算符和(&&)或(||)和exclusive or(^^)仅对两个布尔表达式进行运算,并生成布尔表达式
并且在整个过程中将bvec*列为“布尔类型”。
声明包含以下任何内容的顶点着色器输入是一个编译时错误:

  • 布尔类型(bool、bvec2、bvec3、bvec4)

glslang编译器不会以这种方式解释规范,并且会给予您一个编译错误。

相关问题