opengl连续存储并在纹理上渲染许多点

时间:2014-03-26 20:24:56

标签: opengl shader frame

在我的模拟雪粒子中,简单的点落在三角形地形上。 现在我想绘制点并将它们保持在地形纹理的位置, 粒子落地的地方。我如何存储数百或数千个点。 我不想将这些点存储在一个巨大的阵列中。

是否可以在空纹理上绘制并在下一帧中重复使用此纹理?

2 个答案:

答案 0 :(得分:0)

使用Frame buffer objects,您可以渲染到纹理。

您需要在纹理上累积更改,您有2个选项:

  • 如果您需要对积雪进行采样以计算产生的雪层,您可以使用两个纹理并执行所谓的 ping pong呈现

  • 如果您只是想要积累雪​​而不对已经下降的像素进行采样,则可以在fbo渲染循环中省略glClear并将该纹理用作累积缓冲区(link)。

对于乒乓球渲染,步骤如下:

  • 创建两个相似的纹理,一个源,在目标上,交换每个帧。
  • 这两个与fbo绑定为两个颜色附件,在它们之间切换是通过调用 glDrawBuffers 并将目标colorAtachnmentX作为参数传递来完成的。
  • 将源纹理绑定为着色器
  • 渲染到fbo
  • 将场景中的目标纹理用作积雪。
  • 为新运行交换目标和源纹理。

要知道雪花是否已经落地,你可以提供落雪花作为纹理,雪粒子变量代替颜色数据...然后知道雪花是否已经击中地面进行了fragment world pos的测试,但我们正在那里进入模拟世界......

答案 1 :(得分:0)

我的建议是不要试图如此贴近现实。假它。

当雪粒通过屏幕底部时,它们会死亡。然后随着时间的推移积雪在表面积累。表面上的雪并不等于落下的确切颗粒。

但如果你真的真的想这样做......

首先,你不得不以某种方式处理雪与地面之间的碰撞,然后是雪与地面之间的雪。因为你不再将它们全部放在一个数组中,所以不得不基于雪的像素。这是很多glreadpixles。但是在这个问题上没有问过,所以我假设你已经覆盖了那个。

j-p的答案还不错。但我可能会做的有点不同:

只能使用一个动态纹理。渲染如下:

  1. 渲染背板
  2. 将累积的雪纹理渲染到背板上
  3. 渲染雪粒。
  4. 然后,只要雪粒击中地面或任何碰撞的地方,就可以做到这一点:

    1. 不要弄清楚它 - 所以它仍然包含所有以前下过的雪
    2. 将碰撞的粒子渲染为动态雪纹理
    3. 退出你在动态纹理上绘制的雪粒子 - 那些现在已经“落地”了
    4. 然后下一个帧/周期,你的动态累积雪纹理就会有积雪。