当前位置:  开发笔记 > 编程语言 > 正文

glsl函数指针(或等效的)

如何解决《glsl函数指针(或等效的)》经验,为你挑选了1个好方法。

我试图根据变量的值调用许多函数之一.变量在运行时设置,因此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的每个功能提供模拟,无论多余,愚蠢或不必要......除了着色器子程序.



1> Nicol Bolas..:

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

GLSL 4.00 的可怕的il建议1 着色器子程序功能可能也无济于事.只有你是一个CPU生成的值才有用,而且在你的情况下这似乎不太可能.

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

我的意思是,无论如何,你已经完全通过这种条件谋杀你的表现了.无论如何实现,如果同一个wavefront中的不同实例正在执行单独的代码,那么你的性能就有点紧张了.

更不用说,根据有多少条件,switch语句不一定会变慢.如何实现完全取决于硬件.如果跳转表可用,则可以合理有效地完成(当然,忽略上述性能问题).

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

1如果您想对此提出质疑,请考虑SPIR-V为GLSL的每个功能提供模拟,无论多余,愚蠢或不必要......除了着色器子程序.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有