4

有没有办法通过对 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         
}

还是我必须为这种行为使用计算着色器?

4

1 回答 1

2

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

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

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

于 2013-05-27T15:02:26.037 回答