为什么OpenGL原语中没有椭圆、椭球体和圆柱体?

3

我知道有一些通过像素点画线、圆、椭圆的算法(比如Bresenham算法):

  1. http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
  2. http://en.wikipedia.org/wiki/Midpoint_circle_algorithm

我想知道为什么这些算法(我相信在3D中绘制椭球体、球体、圆柱体也有算法)没有被用于OpenGL来绘制对应的基本图形。难道使用这样的基本图形不是更简单和更有效的性能方式(在OpenGL中非常重要),而不是用线条绘制圆,用三角形绘制球体吗?


仅仅因为显卡通常不理解这些基元。因此,这些基元必须被转换为图形卡可以理解的表示形式(例如线条、三角形等)。有几种这样的转换方式,这也是为什么OpenGL中没有实现的原因之一。 - Nico Schertler
@NicoSchertler 如果这是一个好主意,那么显卡肯定会支持它们。我的观点是这不是一个好主意,但我不明白为什么。 - Narek
3
省略号和类似的东西与线、三角形等完全不同,因此需要额外的硬件,而这些硬件只会偶尔用到。由于所有这些基元都可以使用现有的基元足够好地近似,因此这将是一种浪费空间和金钱的行为。此外,您提到的算法都是迭代算法-并非图形卡特别擅长的领域。不确定是否存在并行算法。此外,插值将变得更加复杂。所有这些事情都更适合由 CPU 完成。 - Nico Schertler
1个回答

3

谁说OpenGL不能绘制这些形状?正如Nico已经解释的那样,由于某些原因,GPU核心中没有Bresenham和其他算法的直接实现。

然而,自几年前起,GPU变得完全可编程,因此您可以渲染几乎任何您喜欢的东西。包括圆形、椭圆形和相关基元。你只需要编写一个着色器程序来完成这个任务 :-)

这里有一个小教程,展示了如何完成:http://www.geeks3d.com/20130705/shader-library-circle-disc-fake-sphere-in-glsl-opengl-glslhacker/


很好。但是为什么它们没有像线、三角形、三角形扇形、三角形条带、四边形等原语列表中一样被集成呢? - Narek
@Narek:因为每种原始数据都需要额外的硅区域,而更重要的是需要与 GPU 的其他部分连接,这只会让事情变得更加复杂。直接编写一个能实现你想要的效果的着色器程序即可。这只是一种成本/效益评估,而曲线边缘比直线边缘更难以推广解决。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接