GLSL具有lessThan、greaterThan等的组件式函数,这些函数返回bvec。也有any()和all(),但似乎没有and()。如果我有两个bvec3,并且需要一个新的bvec3,则等效于:
lessThan
greaterThan
bvec
any()
all()
and()
bvec3
bvec3 new = bvec3(two.x && one.x, two.y && one.y, two.z && one.z);
是否有更快或更优化的方法来实现这一点?我正在尝试编写高度优化的GLSL代码。
5ktev3wc1#
我不确定这样做是否更有效,但我相信您可以通过将两个bvec3值转换为另一个向量类型(如uvec3或vec3)来执行and,对这些类型使用更广泛的操作(如按位与、乘法),然后再转换回来。对于bvec3值one和two,有以下几个选项:
uvec3
vec3
and
one
two
bvec3(uvec3(one) & uvec3(two)) bvec3(uvec3(one) * uvec3(two)) bvec3(vec3(one) * vec3(two))
在使用这个表达式之前,你一定要进行基准测试。组件式表达式很有可能更快。
mpgws1up2#
在Nvidia GPU上,你可以只写bvec3 new = two && one;。说明书在这一点上很混乱。它说逻辑二元运算符和(&&)或(||)和exclusive or(^^)仅对两个布尔表达式进行运算,并生成布尔表达式并且在整个过程中将bvec*列为“布尔类型”。声明包含以下任何内容的顶点着色器输入是一个编译时错误:
bvec3 new = two && one;
bvec*
glslang编译器不会以这种方式解释规范,并且会给予您一个编译错误。
2条答案
按热度按时间5ktev3wc1#
我不确定这样做是否更有效,但我相信您可以通过将两个
bvec3
值转换为另一个向量类型(如uvec3
或vec3
)来执行and
,对这些类型使用更广泛的操作(如按位与、乘法),然后再转换回来。对于
bvec3
值one
和two
,有以下几个选项:在使用这个表达式之前,你一定要进行基准测试。组件式表达式很有可能更快。
mpgws1up2#
在Nvidia GPU上,你可以只写
bvec3 new = two && one;
。说明书在这一点上很混乱。它说
逻辑二元运算符和(&&)或(||)和exclusive or(^^)仅对两个布尔表达式进行运算,并生成布尔表达式
并且在整个过程中将
bvec*
列为“布尔类型”。声明包含以下任何内容的顶点着色器输入是一个编译时错误:
glslang编译器不会以这种方式解释规范,并且会给予您一个编译错误。