【问题标题】:OpenGL height-map painting using CUDA VBO使用 CUDA VBO 绘制 OpenGL 高度图
【发布时间】:2012-01-22 13:09:48
【问题描述】:

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

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

所以我有几个问题。

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

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

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

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

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

【问题讨论】:

  • 使用glBegin/glEnd,您也在每帧将整个数据复制到GPU,但在这种情况下,每个单独的顶点都需要大量的系统调用。所以是的,VBO 始终是正确的方法,如果计算由 CUDA 完成,则更是如此,在这种情况下,绝对不需要将 VBO 数据复制到 CPU。

标签: opengl cuda vbo mandelbrot heightmap


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多