2011-12-17 82 views
1

我已经问过几个有关VBO的问题,并且从我收到的评论中我决定必须采取新的方法。使用CUDA VBO的OpenGL高度图绘制

简而言之 - 我试图绘制一个大的FLOAT数组上定义的Mandelbrot集,大约512X512点。我的程序的目的是让用户控制缩放和世界的方向(这是一个3D模型)。到目前为止我已经使用GL_TRIANGLE_STRIP绘制了整个事物,因为它的绘制过程很慢,所以变成了一个不好的选择。也因为实施我的绘画风格(调用glVertex的顺序)变得不可能为维也纳国际组织编码。

所以我有几个问题。

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

该程序允许用户也可以在世界上移动,所以没有计算在这里完成,因此VBO是一个很好的选择。

1.什么是作画的高度图(当阵列中的每个单元只拥有高度)

2.how我可以把它在VBO并将其传输到CUDA(cudaRegisterBuffer或类似的东西,最好的办法)

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

+0

使用`glBegin/glEnd`,您也可以将每个帧的整个数据都复制到GPU,但是在这种情况下,每个顶点的系统调用都很重。所以是的,一个VBO总是正确的方式,更重要的是,如果计算是由CUDA完成的,在这种情况下绝对不需要将VBO数据复制到CPU。 – 2011-12-17 12:06:13

回答

1

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