0

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

这个完美的答案提供了一个关于从哪里开始的见解SSBO。答案有一个指向具有样板代码的OpenGL ARB 扩展的链接。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, 0, 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, 0, sizeof(GLuint), &zero);
  glUseProgram(program);
  glDrawElements(GL_TRIANGLES, ...);

根据我的设置,我没有任何使用OpenGL 像素的输出。我希望它保持这样。有可能吗,还是我错过了什么?

PS 上面的设置在紧跟glDrawElements.glFinish

更新 21.03.2021

有一个没有附件的帧缓冲区。您唯一应该设置它的状态是它的宽度和高度。如果有人希望最小化设置,那在某种程度上是任何人的方向。

上述的缺点是它仍然需要一些几何图形来馈送到光栅化阶段。要开始着色器阶段,你知道的。但是,作为一个优点,一个人得到几何光栅化,不管你愿不愿意。

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

4

0 回答 0