【问题标题】:How to read back data from fragment shader如何从片段着色器中读回数据
【发布时间】:2016-04-11 14:50:29
【问题描述】:

我正在尝试找出如何将数据从片段着色器读回应用程序,尤其是内置变量中的片段着色器

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

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

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

我特别想在每次片段着色器运行时获取 gl_FragCoord.y 值

【问题讨论】:

  • 我非常怀疑您对渲染管道的理解是否正确。如果您可以可视化每个着色器阶段的输入/输出,我想您会明白为什么写制服没有意义。更重要的是,片段着色器的调用次数是荒谬的。相反,只需假设您的片段着色器为每个可见像素运行一次(在视口变换之后),然后您就可以轻松确定 gl_FragCoord.y 覆盖的值范围。
  • 实际上回答这个问题需要了解您为什么需要这些信息。有多种方法可以确定片段覆盖率,包括遮挡查询、模板缓冲或简单地将每个像素的片段坐标写入帧缓冲区。
  • 您可以使用 fbo 并渲染到纹理,然后您可以使用 glGetTexImage 读回纹理数据
  • @j-p 谢谢你,你能告诉我更多关于如何设置的细节吗?
  • @j-p 你的意思是/建议片段着色器的输出是 gl_FragCoord.y 到帧缓冲对象/图像吗?然后读回来?将新创建的图像绑定到纹理对象后使用 glGetTexImage?

标签: c opengl fragment-shader


【解决方案1】:

好的,我找到了一些方法可以做到这一点,以防有人需要知道,由于没有人提供答案,我自己搜索并找到了它(除了评论者提供的那个)

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

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

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

最后你可以使用图像单元纹理数据从着色器存储到这些缓冲区对象并从中读取,如果有人需要确切的细节,请发表评论,我会提供

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

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2019-01-23
    • 2018-04-02
    相关资源
    最近更新 更多