opengl - 使用 OpenGL 的可编辑纹理

标签 opengl glsl

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

enter image description here

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

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

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

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

最佳答案

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

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

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

这会将 OUT0 写入当前绑定(bind)的帧缓冲区的 GL_COLOR_ATTACHMENT0 并将 OUT1 写入 GL_COLOR_ATTACHEMENT1

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

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

关于opengl - 使用 OpenGL 的可编辑纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43856956/

相关文章:

opengl - 使用 Assimp.Net 和 OpenTK 进行换肤

opengl - 视频的GPU内存分配

c++ - 二维数组在 glUniformMatrix4fv、C++ 中工作吗?

libgdx - glsl 着色器 - 颜色混合,正常模式(如在 Photoshop 中)

c++ - 使用 OpenGL 渲染时 CPU 和 GPU 之间的数据丢失

opengl - 在 2 个轴上旋转 OpenGL 场景

delphi - 在 OpenGL 渲染上下文之上叠加图形

opengl - 添加到 GLuint 属性索引有什么作用?

opengl - 为什么 GL 为您将 `gl_Position` 除以 W 而不是让您自己做?

java - OpenGL 3D 中的平滑模型移动