为啥OpenGL中没有圆形或椭圆基元?

Posted

技术标签:

【中文标题】为啥OpenGL中没有圆形或椭圆基元?【英文标题】:Why is there no circle or ellipse primitive in OpenGL?为什么OpenGL中没有圆形或椭圆基元? 【发布时间】:2010-05-30 14:45:04 【问题描述】:

圆是基本的几何实体之一。然而,OpenGL 中没有为此定义原语,例如线条或多边形。为什么这样?一直为此包含自定义标题有点烦人!

有什么具体原因可以省略吗?

【问题讨论】:

说这取决于分辨率 这样我们可以在技术面试中要求人们写一个圆圈函数。 【参考方案1】:

虽然圆形可能是基本形状,但在光栅化方面,它们不像点、线或三角形那样基本。第一款具有 3D 加速功能的显卡被设计成可以很好地完成一件事,即光栅化三角形(以及线条和点,因为它们添加起来很简单)。添加任何更复杂的形状会使卡片变得更加昂贵,而只添加很少的功能。

但不包括圆形/椭圆还有另一个原因。他们不连接。您无法使用它们构建 3D 模型,也无法在不添加间隙或重叠部分的情况下将三角形连接到它们。因此,要使圆形有用,您还需要其他形状,如曲线和其他更高级的曲面(例如 NURBS)。单独的圆只能用作“大点”,也可以使用四边形和圆形纹理或三角形来完成。

如果您对圆圈使用“自定义标题”,您应该知道那些可能会创建一个三角形模型来形成您的“圆圈”。

【讨论】:

你能解释一下“自定义标题”是什么意思吗? 来自问题。我不知道 Ram 到底是什么意思,但我猜它是一个带有一些 OpenGL 实用函数的库。【参考方案2】:

因为从历史上看,显卡都会渲染点、线和三角形。

您使用足够短的线来计算曲线,这样显卡就不必这样做了。

【讨论】:

【参考方案3】:

因为图形卡在 3 维点、线和三角形上运行。圆需要曲线或样条曲线。它不能用“正常”的 3D 图元完美表示,只能近似为 N 边形(因此在一定距离处它看起来像一个圆)。如果您想要一个圆圈,请自己编写例程(这并不难)。要么将其绘制为 N 边形,要么制作一个正方形(2 个三角形)并使用片段着色器从中切出一个圆形(您可以通过这种方式获得一个完美的圆形)。

【讨论】:

+1。顺便说一句,片段着色器仍然只能通过屏幕上的像素来近似圆。不是一个完美的圈子。 =P @Xavier Ho:不过,使用片段着色器,您几乎可以在距圆的任何距离处获得完美的近似值(在非常近的距离处可能会出现精度误差)。在计算中加入一点抗锯齿,就没有什么可抱怨的了。 “完美近似” - 我称之为矛盾修饰法!是的,你是对的。 @Xavier Ho:“我称之为矛盾修饰法!” :)(以防万一)我的意思是说它仍然由方形像素制成,但不会像传统的 N 边形圆近似那样出现“直”(非弯曲)线段或浪费的顶点。 【参考方案4】:

您始终可以使用gluSphere(如果您正在寻找一个三维形状)。

如果您想绘制一个二维圆,您会遇到自定义方法。我会选择三角扇。

原语被称为原语是有原因的 :)

【讨论】:

以上是关于为啥OpenGL中没有圆形或椭圆基元?的主要内容,如果未能解决你的问题,请参考以下文章

为啥OpenGL图元中没有椭圆、椭球和圆柱

在 OpenGL 的“原始组装”阶段会发生啥

在 OpenGL 中绘制形状的标准(常用)方法是啥?

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

VBO 何时比“简单”的 OpenGL 基元 (glBegin()) 更快?

如何使用 GLEW、OpenGL 或 SDL2 以椭圆运动围绕另一个圆圈旋转一个圆圈?