仅执行一次GLSL功能

时间:2013-05-27 13:01:08

标签: opengl glsl shader nvidia ati

有没有办法在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         
}

或者我是否必须使用计算着色器来处理这种行为?

1 个答案:

答案 0 :(得分:1)

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

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

如果您指定了缓存内容,我可能能够帮助您更多地设置,但因为它变化相当大(纹理/ VBO构造,然后通过顶点属性绑定,可能与实例除数或适当的纹理采样器),现在只是一个盲目的猜测。