只执行一次 GLSL 函数

Posted

技术标签:

【中文标题】只执行一次 GLSL 函数【英文标题】:Executing a GLSL function only once 【发布时间】:2013-05-22 08:21:40 【问题描述】:

有没有办法通过对 GLSL 的某种布尔检查只执行一次函数?还是我错过了一些重要的东西?下面的代码似乎没有帮助。

bool once = false;

DoOnce()

    for (int i = 0; i < someConst; i++)
    
        //do some things...
    
    once = true;


void main()

    if ( !once )
    
       DoOnce();
    
    //do other things         

或者我必须为这种行为使用计算着色器吗?

【问题讨论】:

“仅一次”是什么意思? 只执行一次。每次调用着色器。您是否正在尝试做一些着色器调用相互通信的事情? 如果你有原子操作,你可以让它只执行一次(总共,而不是每次调用),但你不太可能真的想要这样做。对于只执行一次的事情,在 CPU 上执行可能更有效。使用 GLSL 的全部意义在于以大规模并行运行多次。 【参考方案1】:

您似乎想要生成一些数据,以后可以由着色器调用使用,但您不是这样做的。 @Nicol 当然是对的,该函数将在每次调用时被调用,对于顶点着色器的每个顶点,这将是一次,依此类推。理论上,您可以使用变换反馈缓冲区来存储 done 值,但这肯定不是一个好的解决方案。

如果您想编写生成此类缓存的 GLSL 代码,请将代码分为两部分:缓存生成和缓存使用。首先,将缓存生成运行到一些缓冲区中(它们的类型取决于您正在生成的数据;这些可以是纹理、VBO 或其他东西),然后在实际的绘图代码中绑定和使用这些缓冲区。

如果您指定了缓存内容,我可能会在设置方面为您提供更多帮助,但由于差异很大(纹理/VBO 构造,然后通过顶点属性绑定,可能使用实例除数或适当的纹理采样器),现在只是盲目猜测。

【讨论】:

谢谢,看来我必须改变方法了。

以上是关于只执行一次 GLSL 函数的主要内容,如果未能解决你的问题,请参考以下文章

GLSL 中是不是有用于 AND 的内置函数,或者是不是有一些优化的方法来执行组件明智的 AND?

js中setInterval()函数只执行一次的原因

只执行一次的js 函数。

就绪函数指令应该只执行一次

生命周期只执行一次

即使我们在一个表单中多次声明它,如何让 jQuery 函数只执行一次?