使用CUDA VBO的OpenGL高度图绘画

时间:2011-12-17 09:24:50

标签: opengl cuda vbo mandelbrot heightmap

我之前在这里询问过几个关于VBO的问题,从我收到的评论中我决定必须采取新的方法。

简单地说 - 我正在尝试绘制一个大型FLOAT阵列上定义的Mandelbrot集,大约512X512点。我的程序的目的是让用户控制缩放和世界的方向(这是一个3D模型)。 到目前为止,我已经使用GL_TRIANGLE_STRIP描绘了整个事物,因为它的绘制过程缓慢,所以它变成了一个糟糕的选择。另外,因为实现我的绘画风格(调用glVertex的顺序)变得不可能为VBO编码。

所以我有几个问题。

即使在这个描述之后,我也不确定VBO是否是最佳选择,因为用户可以控制计算。对于程序引起的每次计算,我必须重新计算mandelbrot集(~60ms) ,并将这些点重新复制到缓冲区:一个需要一些时间(?ms)的过程。

该程序允许用户也在世界各地移动,因此这里不做任何计算,因此VBO是一个很好的选择。

1.绘制高度贴图的最佳方法是什么(当数组中的每个单元格只保持高度时)

2.我可以将它应用于VBO并将其转移到cuda(cudaRegisterBuffer或类似的东西)

3.有没有办法区分模式并决定何时需要VBO(在无计算模式下)和何时不是(计算模式)。

1 个答案:

答案 0 :(得分:1)

如果 CUDA阵列/ VBO绑定到DirectX / OpenGL VB,则无需每帧复制CUDA数据(有关详细信息,请参阅“CUDA编程指南”)。将数据渲染为高度场的一种方法是使用几何着色器根据高度场发射tris。另一种方法是使用高度字段作为视差图(参考DirectX SDK)。我个人最喜欢的是让你的高度场成为一个位置数组(X / Y / Z)并使用CUDA来仅修改Y值,然后使用索引缓冲区来定义构成表面的多边形。请注意,您还需要更新顶点法线,如果要对曲面进行纹理处理,可能还需要使用XYZ / UV。如果512x512太大,请使用栅格操作(纹理采样)填充感兴趣区域的较低分辨率高度字段。您可以在CUDA或OpenGL / DirectX中执行此阶段(我建议您在CUDA中进行此操作,您可以在下采样时轻松编写自己的采样内核以查找像素。)