三角形是 gpu 限制还是有其他渲染路径?

Posted

技术标签:

【中文标题】三角形是 gpu 限制还是有其他渲染路径?【英文标题】:Are triangles a gpu restriction or are there other rendering pathways? 【发布时间】:2012-09-11 19:25:14 【问题描述】:

作为这个问题的序言,我对 OpenGL 及其背后的数学有充分的了解,虽然我从未接触过与 DirectX 相关的任何东西,但我想这些概念是相似的。

关于为什么将三角形用于 3D 图形有很多信息(它们必须是平面的,除了更小的三角形外,它们是不可分割的,等等)。但是,我想知道三角形是否只是一种存储和操作 3D 数据的便捷方式(关于插值等的更简单的数学运算),或者显卡中是否存在硬件限制,只能实际允许渲染三角形(例如基本上只能应用于三角形的指令)。

接下来,有没有什么方法可以实现对图形渲染的逐像素控制(正如this question 的答案所简要概述的那样)。虽然我很欣赏通过驱动程序对单个像素进行直接控制,但有什么方法可以让我对渲染环境进行这种控制?有没有完全“避免三角形”的方法?

【问题讨论】:

【参考方案1】:

是的,不是的。有点。

当前的 GPU 设计用于渲染三角形,因为三角形很好用。而且因为当前的 GPU 设计用于处理三角形,人们使用三角形,因此 GPU 只需要处理三角形,因此它们被设计为只处理三角形。

正如您所说,三角形只是具有方便使用的优点。 GPU 可以被制造(并且已经被制造)来原生渲染其他原语,但这并不值得。如果你告诉现代 GPU 渲染一个四边形,它会将它分成两个三角形并渲染它们。

不是因为 GPU 无法原生渲染四边形的技术原因,而是因为 不值得在其上花费晶体管。让 GPU 尽可能快地处理三角形会更有用,然后在需要时模拟其他基元。

所以,是的,现代 GPU 具有硬件限制,因此它们不能与四边形一起工作,但并不是因为不可能设计出与四边形一起工作的 GPU。这样做只会降低效率。 :)

至于“避免三角形”,当然,这基本上就是片段着色器所做的:它填充一个像素。 GPU 只需并行运行几百万次即可填满整个屏幕。您可以绘制两个大三角形,形成一个填充整个屏幕的四边形,然后只需指定一个片段着色器,用您喜欢的内容填充它。

如果您想对流程进行更多控制,请改为在软件中进行:一次将一个像素绘制到内存表面,然后将其作为纹理加载到 GPU 上。但它很慢。 :)

【讨论】:

【参考方案2】:

据我所知,每个现代 CAN 渲染四边形甚至 N 边形,但将四边形的渲染时间与 2 个三角形进行比较显示了三角形的优势。 这主要是因为 GPU 已针对渲染三角形进行了优化,并且实际硬件具有比其他(例如纹理)更多的“蒸汽处理器”(用于三角形)。 GPU 上的其他一些处理器类型可以直接渲染四边形,但通常你会发现几个纹理处理器会产生一千个蒸汽 请注意,获得一个纹理单元来渲染一个四边形是非常困难的。理论上是可能的,但没有人将 pricip 用于严重病例。

除非您使用非常接近硬件的操作,否则软件会处理三角形(例如,从四边形自动转换它们)

【讨论】:

GPU 不会“渲染四边形”。他们将一个四边形转换为两个三角形,这就是它慢得多的原因。

以上是关于三角形是 gpu 限制还是有其他渲染路径?的主要内容,如果未能解决你的问题,请参考以下文章

Unity 渲染原理

Unity 渲染原理

渲染管道光栅阶段三“三角形遍历”

渲染管道光栅阶段三“三角形遍历”

使用 SceneKit 通过 Metal 计算管道渲染几何图形

无法在 OpenGL 中绘制三角形,但其他基元渲染良好