重复上述内容: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
有一个没有附件的帧缓冲区。您唯一应该设置它的状态是它的宽度和高度。如果有人希望最小化设置,那在某种程度上是任何人的方向。
上述的缺点是它仍然需要一些几何图形来馈送到光栅化阶段。要开始着色器阶段,你知道的。但是,作为一个优点,一个人得到几何光栅化,不管你愿不愿意。
如果我有时间,我会留下一些代码作为自己的提醒。