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

Posted

技术标签:

【中文标题】为啥OpenGL图元中没有椭圆、椭球和圆柱【英文标题】:Why there is no ellipse, ellipsoid and cylinder in OpenGL primitives为什么OpenGL图元中没有椭圆、椭球和圆柱 【发布时间】:2014-08-23 14:58:59 【问题描述】:

我知道有逐像素绘制线、圆、椭圆的算法(例如 Bresenham 的算法):

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

我想知道为什么这些算法(而且我确信有用于在 3D 中绘制椭圆体、球体、圆柱体的算法)而不是在 OpenGL 中用于绘制相应的图元。在性能方面(这在 OpenGL 中非常重要),使用这样的图元而不是用线画圆,用三角形画球,难道不是更简单有效吗?

【问题讨论】:

只是因为显卡通常不理解这些原语。因此,必须将图元转换为显卡可以理解的表示形式(即线、三角形等)。这样的转换有多种,这也是 OpenGL 中没有实现的原因之一。 @NicoSchertler 如果这是个好主意,显卡肯定会支持它们。我的意思是这不是一个好主意,但我不明白为什么。 椭圆等与直线、三角形等完全不同。因此,它需要额外的硬件,这些硬件只能偶尔使用一次。由于所有这些原语都可以用现有的原语很好地近似,这将浪费空间和金钱。此外,您提到的算法是迭代算法 - 不是显卡特别擅长的。不确定是否有并行算法。此外,插值会变得更复杂一些。所有这些都更适合 CPU。 【参考方案1】:

谁说 OpenGL 不能绘制这些形状?由于 Nico 已经解释过的原因,在 GPU 内核中没有直接实现 Bresenham 和朋友。

但是,由于几年前 GPU 已经完全可编程,因此您几乎可以渲染任何您喜欢的东西。包括圆、椭圆和相关的基元。您只需要编写一个着色器程序即可:-)

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

【讨论】:

太棒了。但是为什么它们没有集成在线、三角形、三角形扇形、三角形条纹、四边形等基元列表中。 @Narek:因为每种基元都需要额外的硅面积,但更重要的是连接到 GPU 的其他部分,这会使事情变得复杂。只需编写一个着色器来做你想做的事情。这只是一个成本/收益评估,弯曲的边缘比直的边缘更难概括问题。

以上是关于为啥OpenGL图元中没有椭圆、椭球和圆柱的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 OpenGL 绘制椭球的问题

计算机图形学输出图元_6_OpenGL曲线函数_5_其他曲线

简述高斯投影原理

VBO 比绘制图元的过时方法慢 - 为啥?

如何在现代opengl中绘制圆柱体