Opengl 仅执行一次GLSL函数

Opengl 仅执行一次GLSL函数,opengl,glsl,shader,nvidia,ati,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();

有没有一种方法可以通过对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         
}
bool once=false;
杜恩斯()
{
for(int i=0;i

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

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

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


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

您所说的“仅一次”是什么意思?这将只执行一次。每次调用着色器。您是否尝试在着色器调用相互对话的情况下执行某些操作?如果您有原子操作,则可以使其仅执行一次(总计,而不是每次调用),但您不太可能真的希望这样做。对于只执行一次的东西,只在CPU上执行可能更有效。使用GLSL的全部目的是多次大规模并行运行。谢谢,看来我必须改变我的方法。