c-GLSL片段着色器可以在没有帧缓冲区和类似不便的情况下运行吗



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

这个完美的答案让我们深入了解了从SSBO的哪里开始。答案有一个指向OpenGLARB扩展的链接,该扩展有一个样板代码。如果对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像素的输出。我希望它保持原样。有可能吗,还是我错过了什么?

第页。S上面的设置在glDrawElements后面紧接着glFinish之后给我错误无效的帧缓冲区操作

更新日期:2021年3月21日

存在没有附件的帧缓冲区。在它的状态下,唯一应该设置的是它的宽度和高度。这在某种程度上是任何人都在努力的方向,如果你想尽量减少设置的话。

前面提到的缺点是,它仍然需要一些几何图形才能进入光栅化阶段。要开始着色器阶段,您知道。但是,作为一个加分项,不管你愿不愿意,你都可以获得几何体光栅化。

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

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

没有。片段着色器需要调用它们的步骤。产生称为光栅化的片段的阶段。

来自khronos wiki:

片段着色器是着色器阶段将处理光栅化生成的片段转换为一组颜色和单个深度值。

片段着色器是基本体光栅化后的OpenGL管道阶段。

光栅化需要一个渲染步骤来生成片段。渲染是在某个地方完成的。在OpenGL中,它是对帧缓冲区进行的。因此,如果没有帧缓冲区,就无法进行渲染,因此OpenGL不能产生碎片。

帧缓冲区的设置可以通过不带附件的帧缓冲区。但需要提供几何体并对其进行渲染,才能调用片段着色器。

片段着色器可以读取和写入任意SSBO。但其用法与计算着色器不同。片段着色器对每个生成的片段进行调用,并且可以任意调用计算着色器。

非常感谢所有向我指出碎片着色器需要渲染操作的原因的评论者。

相关内容

最新更新