1

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

简而言之 - 我正在尝试绘制在大型 FLOAT 数组上定义的 Mandelbrot 集,大约 512X512 点。我的程序的目的是让用户控制缩放和世界的方向(它是一个 3d 模型)。到目前为止,我已经使用 GL_TRIANGLE_STRIP 绘制了整个东西,由于其缓慢的绘制过程,这变成了一个糟糕的选择。也因为实现我的绘画风格(调用 glVertex 的顺序)变得不可能为 VBO 编码。

所以我有几个问题。

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

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

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

2.我如何将它应用到 VBO 并将其传输到 cuda (cudaRegisterBuffer 或类似的东西)

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

4

1 回答 1

1

如果绑定,则不需要每帧复制 CUDA 数据将 CUDA 数组/VBO 转换为 DirectX/OpenGL VB(有关详细信息,请参阅 CUDA 编程指南)。将数据渲染为高度场的一种方法是使用几何着色器根据高度场发出 tris。另一种方法是使用高度场作为视差图(参考 DirectX SDK)。我个人的最爱是让你的高度场成为一个位置数组(X/Y/Z)并使用 CUDA 仅修改 Y 值,然后使用索引缓冲区来定义组成表面的多边形。请注意,您还需要更新顶点法线,如果要对表面进行纹理处理,您可能还需要使用 XYZ/UV。如果 512x512 太大,请使用 raster-ops(纹理采样)填充感兴趣区域的低分辨率高度场。你可以在 CUDA 或 OpenGL/DirectX (I'

于 2011-12-19T03:37:18.100 回答