如何在moderngl中将帧缓冲用作下一帧的纹理?
曼德博集合动画实现问题:帧缓冲纹理循环复用
我正在制作曼德博集合逐步显现的动画,以下是我的片段着色器代码:
#version 330 uniform sampler2D previousIteration; in vec2 uv; /* from -1 to 1 */ out vec4 color; layout (location=1) out vec4 zValue; void main() { vec4 state = texture(previousIteration, uv); float newReal = state.x * state.x - state.y * state.y + uv.x; float newImag = 2 * state.x * state.y + uv.y; float newAbs2 = newReal * newReal + newImag * newImag; if (newAbs2 < 4) { color = vec4(0.0, 0.0, 0.0, 1.0); } else { color = vec4(1.0, 1.0, 1.0, 1.0); } zValue = vec4(newReal, newImag, 0.0, 0.0); }
我的需求和问题:
- 已实现将
color输出的帧缓冲渲染到moderngl-window屏幕上,但不知道如何把zValue输出的帧缓冲作为下一帧的previousIteration纹理传入着色器。
尝试过的思路与困惑:
- 看过相关示例,但示例使用
image2D而非纹理,我更倾向于使用纹理,希望通过直接赋值zValue = ...的方式保存数据,不想使用imageStore。 - 知道可以将帧缓冲内容复制到numpy数组,再将数组作为纹理传回GPU,但这种方式会导致数据在RAM和GPU之间往返,我想避免这种性能开销。
- 看到有回答提到不需要“复制FBO到纹理”,但我无法理解这句话的含义。
- 找到过C语言中的
glCopyTexImage2D()函数,功能似乎正是我需要的,但在moderngl的Python API中找不到对应的方法,而且该函数在现代代码中已被弃用或很少使用。
内容的提问来源于stack exchange,提问作者Георгий Тимофеевский
相关产品推荐
相关产品推荐

