【问题标题】:Drawing triangles with CUDA使用 CUDA 绘制三角形
【发布时间】:2010-01-10 21:02:50
【问题描述】:

我正在编写自己的图形库(是的,它的功课:)并使用 cuda 快速完成所有渲染和计算。

我在绘制实心三角形时遇到问题。我是这样写的,一个进程画一个三角形。当场景中有很多小三角形时它工作得很好,但是当三角形很大时它会完全破坏性能。

我的想法是做两次传球。首先计算仅包含有关扫描线信息的选项卡(从这里到那里绘制)。这将是每个进程计算的三角形,就像在当前算法中一样。在第二遍中,真正绘制每个三角形多个进程的扫描线。

但它会足够快吗?也许有更好的解决方案?

【问题讨论】:

    标签: algorithm parallel-processing cuda rasterizing


    【解决方案1】:

    您可以查看blogCUDA 中的软件渲染管道。我不认为这是最好的方法,但至少作者分享了一些有用的资源。

    其次,阅读paper可编程的并行渲染架构。我认为这是最新的论文之一,它也是基于 CUDA 的。

    如果我必须这样做,我会使用像 Larrabee(即 TBR)甚至 REYES 中的 数据并行光栅化管道,并使其适应 CUDA:

    http://www.ddj.com/architect/217200602 http://home.comcast.net/~tom_forsyth/larrabee/Standford%20Forsyth%20Larrabee%202010.zip(见演示的第二部分)

    http://graphics.stanford.edu/papers/mprast/

    【讨论】:

      【解决方案2】:

      我怀疑您对 CUDA 以及如何使用它有一些误解,尤其是当您提到“过程”时,在 CUDA 术语中没有这样的东西。

      对于大多数 CUDA 应用程序,要获得良好的性能有两个重要的方面:优化内存访问并确保 warp 中的每个“活动”CUDA 线程与 warp 中的其他活动线程同时执行相同的操作。这两个听起来对您的应用程序都很重要。

      为了优化您的内存访问,您需要确保从全局内存中读取和对全局内存的写入是合并的。您可以在 CUDA 编程指南中阅读更多相关信息,但这实质上意味着,半扭曲中的相邻线程必须从相邻的内存位置读取或写入。此外,每个线程应一次读取或写入 4、8 或 16 个字节。

      如果您的内存访问模式是随机的,那么您可能需要考虑使用纹理内存。当你需要在一个块中引用已经被其他线程读取的内存时,你应该使用共享内存。

      在你的情况下,我不确定你的输入数据是什么,但你至少应该确保你的写入是合并的。您可能需要投入一些不小的努力才能让您的阅读工作高效。

      对于第二部分,我建议每个 CUDA 线程处理输出图像中的一个像素。使用这种策略,您应该注意内核中的循环,这些循环将根据每个线程的数据执行更长或更短。经线中的每个线程都应该以相同的顺序执行相同数量的步骤。唯一的例外是,让warp中的一些线程不执行任何操作而其余线程一起执行相同的操作,并没有真正的性能损失。

      因此,我建议让每个线程检查其像素是否在给定的三角形内。如果没有,它应该什么都不做。如果是,它应该计算该像素的输出颜色。

      另外,我强烈建议您阅读有关 CUDA 的更多信息,因为您似乎在没有很好地理解一些基本原理的情况下跳入深渊。

      【讨论】:

      • 对不起我的语言,英语不是我的母语。那么在显卡上进行处理的正确术语是什么?好吧,我认为我对 CUDA 的理解非常好,但是是的,我缺乏并行算法方面的知识。我的输入是裁剪空间中的一组顶点,我必须绘制三角形。我认为每个像素都应该检查每个三角形的算法不是最优的。
      • 避免每个像素检查每个三角形可以通过使用 BVH、KD-Tree 或 R-Tree 对三角形进行分区来完成。
      【解决方案3】:

      不要粗鲁,但这不就是显卡的设计初衷吗?似乎使用标准的 OpenGL 和 Direct3D API 会更有意义。

      为什么不使用 API 来进行基本渲染,而不是使用低级得多的 CUDA?然后,如果您希望执行不支持的其他操作,您可以使用 CUDA 将它们应用在上面。或者也许将它们实现为着色器。

      【讨论】:

      • 是的,确实是的。但他的目标是在没有传统 API 的情况下构建图形光栅化管道。将其视为概念验证或教育目的项目。
      • 是的,它是我学习的项目。我们必须自己进行所有光栅化。大多数人使用 CPU,但我决定使用 CUDA。
      • 嗯,在这种情况下,这听起来像是一个有趣的项目。有点反击的方法,但仍然很有趣。
      • 是的,直到现在我在 opengl 编程时都尽量避免使用所有矩阵,但现在我不怕它们了:>
      猜你喜欢
      • 2021-11-07
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多