如何从片段着色器读回数据

hop*_*per 1 c opengl fragment-shader

我试图找出如何将数据从片段着色器读回到应用程序,但特别是内置变量中的片段着色器

这是我正在尝试做的一个示例,在下面的片段着色器中,我尝试将片段着色器变量 gl_FragCoord.y 读回应用程序

#version 330
out vec4 outputColor;
void main()
{
  gl_FragCoord.y??????
outputColor = vec4(0.2f, 0.2f, 0.2f, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)

我如何将此值传递回应用程序,是通过统一变量完成的吗?缓冲对象?或者其他方式?或者根本可以做到吗?

我特别尝试获取每次片段着色器运行时的 gl_FragCoord.y 值

hop*_*per 6

好吧,我找到了几种方法来做到这一点,以防有人需要知道,并且由于没有人提供答案,我自己搜索并找到了它(除了评论者提供的方法之外)

该问题的一位评论员提到了第一种方法,即创建一个帧缓冲区/渲染缓冲区对象作为图像,直接从着色器向其写入数据并将数据作为图像读回,或者通常从帧缓冲区读回使用 glReadPixels() 来当前绑定的帧缓冲区对象

第二种方法是在片段着色器中创建缓冲区对象/数组,以从上面提到的变量写入,并使用 glMapBuffer*() 映射缓冲区数据,并获取指向缓​​冲区的指针并在应用程序中读回该值

另一个方法是创建一个缓冲区对象,然后使用 glGetBufferSubData 读回从着色器写入的所有内容(显然您也将缓冲区对象声明为读/写)

最后,您可以使用图像单元纹理数据也从着色器存储到这些缓冲区对象并从它们读回,如果有人需要确切的详细信息,请发表评论,我将提供

看到它是可能的,并且不止一种方法可以做到这一点,但是它不会在每次片段着色器运行时运行,而是片段着色器会将信息存储到缓冲区对象和上述信息中,并在执行后读回应用程序,但是结果仍然是相同的,因为每个片段的 gl_FragCoord.y 将作为一块内存进行存储和访问