有没有一种方法可以通过对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
}

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

最佳答案

看来您想生成一些数据,以后可以被着色器调用使用,而这不是您要做的。 @Nicol当然是正确的,该函数将被称为每次调用,对于顶点着色器,每个顶点将是一次,依此类推。从理论上讲,您可以使用Transform Feedback缓冲区存储done值,但这绝对不是一个好的解决方案。

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

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

10-08 01:05