问题描述
重复上述内容:GLSL 片段着色器能否在没有帧缓冲区和任何光栅化阶段的情况下运行?
This 完美答案提供了有关从哪里开始使用 SSBO
的见解。答案有一个指向 OpenGL
ARB extension 的链接,其中包含一个样板代码。如果对 OpenGL
计算程序进行一些更改,该代码对我有用。但是,我真的不明白,片段程序怎么办? 并且除了 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 (将#修改为@)