我试图根据变量的值调用许多函数之一.变量在运行时设置,因此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 =; float output = func (); // <-------------- color = vec4(output, output, output, 1); }
Nicol Bolas.. 9
GLSL没有函数指针.甚至SPIR-V也没有函数指针.着色器代表有限的执行环境.其中一个限制是缺乏对堆栈的要求.如果没有其中任何一个,你就无法拥有任意的函数指针.
GLSL 4.00 的可怕的il建议1 着色器子程序功能可能也无济于事.只有你
是一个CPU生成的值才有用,而且在你的情况下这似乎不太可能.
您拥有的唯一通用解决方案是switch语句.坦率地说,这并没有错.
我的意思是,无论如何,你已经完全通过这种条件谋杀你的表现了.无论如何实现,如果同一个wavefront中的不同实例正在执行单独的代码,那么你的性能就有点紧张了.
更不用说,根据有多少条件,switch语句不一定会变慢.如何实现完全取决于硬件.如果跳转表可用,则可以合理有效地完成(当然,忽略上述性能问题).
此外,有三十二上校的想法,你将每个函数的操作编码为具有常量向量的点积.显然,这限制了您的各种功能实际执行的内容.但是,如果它适用于您的情况,它的工作原理.
1如果您想对此提出质疑,请考虑SPIR-V为GLSL的每个功能提供模拟,无论多余,愚蠢或不必要......除了着色器子程序.
GLSL没有函数指针.甚至SPIR-V也没有函数指针.着色器代表有限的执行环境.其中一个限制是缺乏对堆栈的要求.如果没有其中任何一个,你就无法拥有任意的函数指针.
GLSL 4.00 的可怕的il建议1 着色器子程序功能可能也无济于事.只有你
是一个CPU生成的值才有用,而且在你的情况下这似乎不太可能.
您拥有的唯一通用解决方案是switch语句.坦率地说,这并没有错.
我的意思是,无论如何,你已经完全通过这种条件谋杀你的表现了.无论如何实现,如果同一个wavefront中的不同实例正在执行单独的代码,那么你的性能就有点紧张了.
更不用说,根据有多少条件,switch语句不一定会变慢.如何实现完全取决于硬件.如果跳转表可用,则可以合理有效地完成(当然,忽略上述性能问题).
此外,有三十二上校的想法,你将每个函数的操作编码为具有常量向量的点积.显然,这限制了您的各种功能实际执行的内容.但是,如果它适用于您的情况,它的工作原理.
1如果您想对此提出质疑,请考虑SPIR-V为GLSL的每个功能提供模拟,无论多余,愚蠢或不必要......除了着色器子程序.