GLSL 片段着色器能否在没有帧缓冲区和类似不便的情况下运行?

问题描述

重复上述内容:GLSL 片段着色器能否在没有帧缓冲区和任何光栅化阶段的情况下运行?

This 完美答案提供了有关从哪里开始使用 SSBO 的见解。答案有一个指向 OpenGL ARB extension链接,其中包含一个样板代码。如果对 OpenGL 计算程序进行一些更改,该代码我有用。但是,我真的不明白,片段程序怎么办? 并且除了 SSBO 之外没有任何其他缓冲区。

代码中明显有片段源代码,没有任何像素操作,只有SSBO

  in vec4 color;

  void main()
  {
    uint fragmentNumber = atomicCounterIncrement(fragmentCounter);
    if (fragmentNumber < maxFragmentCount) {
      fragments[fragmentNumber].position = ivec2(gl_FragCoord.xy);
      fragments[fragmentNumber].color    = color;
    }
  }

然后在 C 程序文件中:

  // Generate,bind,and specify the data store for the atomic counter.
  glGenBuffers(1,&counterBuffer);
  glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER,counterBuffer);
  glBufferData(GL_ATOMIC_COUNTER_BUFFER,sizeof(gluint),NULL,GL_DYNAMIC_DRAW);

  // Reset the atomic counter to zero,then draw stuff.  This will record
  // values into the shader storage buffer as fragments are generated.
  gluint zero = 0;
  glBufferSubData(GL_ATOMIC_COUNTER_BUFFER,&zero);
  gluseProgram(program);
  glDrawElements(GL_TRIANGLES,...);

根据我的设置,我没有任何以OpenGL 像素为单位的输出。我希望它一直这样。有可能吗,还是我遗漏了什么?

P.S 上述设置在 glDrawElements 后紧跟 glFinish 后给我错误 invalid framebuffer operation

2021 年 3 月 21 日更新

一个 Framebuffers with no attachments。您应该在其状态中设置的唯一内容是其宽度和高度。如果有人希望最大限度地减少设置,那这在某种程度上是任何人的方向。

上述的缺点是它仍然需要一些几何图形才能进入光栅化阶段。要开始着色器阶段,您知道。但是,作为一个加号,无论是否愿意,都可以进行几何光栅化。

如果我有时间,我会留下一些代码作为自己的提醒。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)