在回答这个问题之前,我对OpenGL及其背后的数学有很好的理解,虽然我从未接触过与DirectX相关的任何东西,但我认为这些概念是相似的。
关于为什么三角形被用于3D图形,有很多信息(它们必须是平面的,除了更小的三角形之外是不可分割的,等等)。然而,我想知道三角形是否只是存储和操作3D数据的一种方便方式(关于插值等更简单的数学运算),或者图形卡中是否存在硬件限制,只允许真实地渲染三角形(例如,基本上只能应用于三角形的指令)。
接下来,有没有任何方法可以实现图形渲染的逐像素控制(正如这个问题的答案简要概述的那样)。虽然我很欣赏通过驱动程序直接控制单个像素,但有什么方法可以控制渲染环境吗?有没有办法完全"避开三角形"?
是和否。
当前的GPU被设计为渲染三角形,因为三角形很好用。因为当前的GPU是为处理三角形而设计的,人们使用三角形,所以GPU只需要处理三角形,所以它们被设计为只处理三角形。
正如你所说,三角形的优点是使用起来很方便。GPU可以(并且已经)以原生方式渲染其他基元,但这并不值得。如果你告诉现代GPU渲染四边形,它会将其拆分为两个三角形并渲染它们。
这并不是因为GPU无法原生渲染四边形有技术原因,而是因为不值得在上花费晶体管。将GPU集中在尽可能快地创建三角形上,然后在需要时模拟其他基元,这会更有用。
所以,是的,现代GPU有硬件限制,所以它们不能与四边形一起工作,例如,但这并不是因为不可能设计出与四边形配合工作的GPU。这样做只会降低效率。:)
至于"避免三角形",当然,片段着色器基本上就是这样做的:它填充一个像素。GPU只需并行运行几百万次就可以填充整个屏幕。你可以画两个大三角形,形成一个填充整个屏幕的四边形,然后只指定一个片段着色器,用你喜欢的内容填充它。
如果你想对这个过程有更多的控制权,可以用软件来实现:一次在内存表面绘制一个像素,然后将其作为纹理加载到GPU上。但速度很慢。:)
据我所知,每一个现代CAN渲染四边形,甚至一些N边形,但它将一个四边形的渲染时间与2个三角形进行比较,显示了三角形的优势。这主要是因为GPU已经被优化为渲染三角形,而且实际硬件的"蒸汽处理器"(用于三角形)比其他处理器(如纹理处理器)多得多。GPU上的其他一些处理器类型可以直接渲染四边形,但通常情况下,你会发现几个纹理处理器有一千个蒸汽请注意,使用纹理单元渲染四边形是非常困难的。这在理论上是可能的,但没有人用pricip来处理严重的案件。
除非你使用非常硬件的闭合操作,否则软件会处理三角形,(例如,从四边形自动转换)