gpt4 book ai didi

glsl 函数指针(或等效的)

转载 作者:行者123 更新时间:2023-12-04 03:36:46 29 4
gpt4 key购买 nike

我试图根据变量的值调用许多函数之一。该变量是在运行时设置的,因此 CPU 上的代码将不起作用。由于存在大量可能性,使用 if/switch 语句会很慢。[可能不正确]

我正在寻找一种将函数存储在数组中的方法,要么使用函数指针,要么将实际方程(例如 texcoord.x*2)存储在数组中。

示例伪代码:

    in vec2 texcoord;
out vec4 color;

int number; //Assigned a number between 0 and 300 during runtime

float func1(void) {
return texcoord.x + texcoord.y;
}

float func2(void) {
return texcoord.x*2;
}

...

float func299(void) {
return texcoord.y - 7;
}

void main(void) {
number = <something calculated during runtime>;
float output = func<number>(); // <--------------
color = vec4(output, output, output, 1);
}

最佳答案

GLSL 没有函数指针。甚至 SPIR-V 也没有函数指针。着色器代表有限的执行环境。这些限制之一是缺乏对堆栈的要求。如果没有其中之一,您就无法真正拥有任意函数指针。

可怕的错误建议1 shader subroutines GLSL 4.00 的功能可能也无济于事。只有您的 <something calculated during runtime> 才会有帮助是 CPU 生成的值,在您的情况下似乎不太可能。

您拥有的唯一通用解决方案是 switch 语句。坦率地说,这并没有错。

我的意思是,无论如何,你已经会通过这种条件来彻底扼杀你的表现。不管它是如何实现的,如果同一波前的不同实例正在执行单独的代码,那么您在性能方面就有点搞砸了。

更不用说,switch 语句不一定会根据条件的数量变慢。它如何实现完全取决于硬件。如果有可用的跳转表,就可以合理高效地完成(当然忽略上面的性能问题)。

此外,还有三十二上校的想法,您可以将每个函数的操作编码为具有常数向量的点积。显然,这限制了您的各种功能可以实际执行的内容。但如果它适用于您的情况,它就可以工作。

1 如果您想对此提出异议,请考虑 SPIR-V 为 GLSL 的每个功能提供了一个模拟,无论多么冗余、愚蠢或不必要……除了着色器子例程。

关于glsl 函数指针(或等效的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467358/

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