重复上述步骤: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, 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
像素。我希望它保持这样。这是可能的,还是我错过了什么?
P.S上面的设置给我错误无效的帧缓冲区操作在glDrawElements
之后立即跟随glFinish
。
更新日期:2021年3月21日
有一个没有附件的帧缓冲区。你唯一需要设置的是它的宽度和高度。如果你想最小化设置的话,这是任何人都要做的。
前面提到的缺点是,它仍然需要一些几何图形被馈送到光栅化阶段。开始着色器阶段,你知道。但是,作为一个优点,一个得到几何光栅化,希望它与否。
如果我有时间,我会留下一些代码来提醒自己。
1条答案
按热度按时间jslywgbw1#
GLSL片段着色器是否可以在没有帧缓冲区和类似不便的情况下运行?
不需要。片段着色器需要调用它们的步骤。产生片段的阶段称为光栅化。
从
khronos wiki
:片段着色器是将光栅化生成的片段处理为一组颜色和单个深度值的着色器阶段。
片段着色器是光栅化图元后的OpenGL管道阶段。
光栅化需要一个渲染步骤来产生碎片。渲染是在某个地方完成的。在OpenGL中,它是在帧缓冲区完成的。所以没有帧缓冲区,你就不能渲染,因此OpenGL就不能产生碎片。
帧缓冲区的设置可以通过没有附件的帧缓冲区最小化。但是需要提供几何图形并渲染它,以调用片段着色器。
片段着色器可以读取和写入任意的
SSBO
。但用法与计算着色器不同。片段着色器在每个生成的片段上调用,而计算着色器可以被任意调用。非常感谢所有的评论者,他们给我指出了碎片着色器需要渲染操作的明显原因。