我正在编写自己的图形库(是的,它的作业:)并使用cuda快速完成所有渲染和计算。
绘制实心三角形时遇到问题。我这样编写了一个进程绘制一个三角形。当场景中有很多小三角形时它工作得很好,但是当三角形很大时它会完全破坏性能。
我的想法是两次通过。首先计算仅包含扫描线信息的选项卡(从此处绘制到此处)。这将是每个过程计算的三角形,就像当前算法一样。在第二遍中,每个三角形实际上绘制的扫描线有多个进程。
但它会足够快吗?也许有更好的解决方案?
答案 0 :(得分:3)
您可以查看blog: CUDA中的软件渲染管道。我认为这不是最佳方式,但至少作者分享了一些有用的资料。
其次,请阅读paper:可编程,并行渲染架构。我认为这是最新的论文之一,它也是基于CUDA的。
如果我必须这样做,我会选择像Larrabee(TBR)那样的数据并行光栅化管道,甚至是REYES,并将其改编为CUDA:
http://www.ddj.com/architect/217200602 http://home.comcast.net/~tom_forsyth/larrabee/Standford%20Forsyth%20Larrabee%202010.zip(见演示文稿的第二部分)
答案 1 :(得分:0)
我怀疑你对CUDA以及如何使用它有一些误解,特别是因为你提到了一个“过程”,在CUDA术语中,没有这样的事情。
对于大多数CUDA应用程序,获得良好性能有两个重要方面:优化内存访问并确保warp中的每个“活动”CUDA线程在warp中的同一活动线程的同时执行相同的操作。这些听起来都非常适合您的应用。
要优化内存访问,您需要确保从全局内存中读取内容并将对全局内存的写入合并。您可以在CUDA编程指南中阅读更多相关信息,但这实际上意味着,半经线中的相邻线程必须读取或写入相邻的存储器位置。此外,每个线程一次应读取或写入4,8或16个字节。
如果您的内存访问模式是随机的,那么您可能需要考虑使用纹理内存。当您需要引用已被块中其他线程读取的内存时,您应该使用共享内存。
在您的情况下,我不确定您的输入数据是什么,但您至少应该确保您的写入合并。您可能需要投入一些非常重要的努力来使您的读取有效地工作。
对于第二部分,我建议每个CUDA线程处理输出图像中的一个像素。使用此策略,您应该注意内核中的循环,这些循环将根据每个线程数据执行更长或更短的时间。 warp中的每个线程应以相同的顺序执行相同数量的步骤。唯一的例外是,在warp中的某些线程执行无操作而其余线程一起执行相同的操作时,没有真正的性能损失。
因此,我建议让每个线程检查其像素是否在给定三角形内。如果没有,它应该什么都不做。如果是,则应计算该像素的输出颜色。
另外,我强烈建议您阅读更多有关CUDA的内容,因为您似乎在没有充分了解一些基本原理的情况下跳入深渊。
答案 2 :(得分:-1)
不要粗鲁,但这不是显卡的设计目的吗?似乎使用标准OpenGL和Direct3D API会更有意义。
为什么不使用API来进行基本渲染,而不是使用低级别的CUDA?然后,如果您希望执行其他不受支持的操作,可以使用CUDA将它们应用于顶部。或者可以将它们实现为着色器。