【问题标题】:Editable Texture with OpenGL使用 OpenGL 的可编辑纹理
【发布时间】:2017-10-07 00:08:03
【问题描述】:

我正在尝试利用 gpu 的并行性来制作图像处理应用程序。我有一个着色器,它采用两个纹理,并基于一些统一变量计算输出纹理。但是每个纹理像素都需要一个额外的元数据字节,而不是透明度 alpha 值,这在计算中是必需的:


所以我考虑每帧运行两次着色器,一次将动态元数据计算为单字节纹理,一次计算生成的 Paint Texture,我需要 3 个字节(以限制内存使用,因为可能一次加载相当多的此类纹理)。

我觉得上面的问题有点复杂,我是用opengl画的 屏幕,但这次我需要绘制两种不同的纹理, 我不知道该怎么做。此外,gl_FragColor 内置变量的 类型是 vec4,但我需要不同的输出值。

  • 所以,总结一下,片段着色器是否可以输出 除了 vec4 之外还有什么?
  • 是否可以通过一次调用保存到两个不同的纹理?
  • 是否可以制作可编辑的纹理来存储更改,直到编辑结束并且必须将数据传回 cpu?
  • 什么 openGL 调用对上述情况最有用?
  • 油漆纹理也应该能够被检索以显示在屏幕上。

以上内容可以很容易地通过 cpu 上的 blitting 纹理来完成。 我可以将所有相关数据保存在 cpu 上,以 60 次/秒的速度完成所有工作, 并通过将数据从 cpu 传递到 gpu 来更新相关纹理。 用于每帧更改纹理的相对较小区域 (大约 512x512 大小纹理的总比例的约 20%),您认为上述方法值得麻烦吗?

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    这取决于您使用的 OpenGL 版本。

    最新的 OpenGL 4+ 没有 gl_FragColor 变量,而是允许您从片段着色器写入任意数量(最多支持的最大值)的输出颜色,每个颜色都发送到相应的帧缓冲区颜色附件:

    layout(location = 0) out vec4 OUT0;
    layout(location = 1) out float OUT1;
    

    这会将当前绑定的帧缓冲区的OUT0 写入GL_COLOR_ATTACHMENT0OUT1GL_COLOR_ATTACHEMENT1

    但是,考虑到您使用gl_FragColor,您使用的是一些旧版本的 OpenGL。我不精通旧的 OpenGL 版本,但您可以检查您的实现是否支持 GL_ARB_draw_buffers 扩展和/或 gl_FragData[] 输出变量。

    此外,如上所述,不清楚为什么不能使用单个 RGBA 纹理并将其 Alpha 通道用于该元数据。

    【讨论】:

    • 感谢您的回答,确实我使用的是较旧的版本 120,原因是它可能更易于访问。不过我会看看你的建议。
    猜你喜欢
    • 2015-07-30
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多