OpenGL ES - 如何绘制填充的多边形?

9
我尝试在Google和Stack Overflow上搜索,但没有找到任何内容 :-(
Mapping irregular shapes or other polygons (cartoons, sprites) to triangles in OpenGL ES

我想要在iPad上使用OpenGL ES绘制填充多边形(2D,不需要3D) (我是OpenGL和OpenGL ES的新手) 在OpenGL上似乎很简单,但是在ES中只能画三角形。

但是我找不到任何好的教程 :-( 是否存在任何包装器/库或其他任何可以帮助我的东西?

我不想使用CoreGraphics,因为对于我正在做的事情来说太慢了^^
如果可能的话,避免使用(大)库,如Cocos2D。

编辑:正在解决问题,以下是一些有用的链接(将编辑)
链接
- 多边形三角剖分
http://www.vterrain.org/Implementation/Libs/triangulate.html
http://en.wikipedia.org/wiki/Polygon_triangulation(WIKI) http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml(没有孔的多边形) http://www.cs.unc.edu/~dm/CODE/GEM/chapter.html(有孔的多边形,C代码)

解决方案
我将尝试使用多边形镶嵌来获取三角形。首先我将尝试(http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml),因为我需要带有孔的多边形,所以第二个链接是(http://www.cs.unc.edu/~dm/CODE/GEM/chapter.html)。如果有更好的方法,请在评论中告诉我^^

谢谢:-)


嘿,你好啊。你用你编辑的解决方案成功了吗?现在,7年后,你有什么其他的见解吗? :) - DarkCygnus
6个回答

5

我没有尝试使用OpenGL ES,但从快速查看文档来判断,您应该能够使用“三角形扇形”来绘制一个多边形:

glVertexPointer(2, ..., arrayOfCoordinates)
...
glDrawElements(GL_TRIANGLE_FAN, ... , arrayOfIndices);

您可以将“三角扇形”想象成自行车轮辐将轮子的区域分为“三角形”(当然,自行车轮的外边缘是圆形的,但我希望您能理解这个概念)。
更新:我在网上找到了一个小图示:http://www.cse.msu.edu/~cse472/step6_stuff/step6.1.gif

4
只要多边形是凸的就可以! - Daniel Paull
@Daniel:完全正确!(我没有提到吗?当然可以把多边形分成三角形并使用GL_TRIANGLES绘制,但听起来他想避免这样做...) - S.C. Madsen
是的,我正在基于在这里找到的代码(http://www.cocos2d-iphone.org/forum/topic/848)上开发一个解决方案。但是它只适用于多边形是凸多边形的情况,就像Daniel所说的那样。如果有任何进展,我会告诉你的。 - Vinzius
1
我记得看到过将多边形分割成凸多边形的算法,你可以尝试使用谷歌搜索。无论如何,我希望你能解决你的问题 :-) - S.C. Madsen
谢谢你的答案,非常有帮助,尤其是图形说明。是的,这对于所有凸多边形都适用,但只要扇形辐条和边不相交,它也适用于某些凹多边形。例如,如果我们将点b和h远离起始点a向左移动,使多边形变为凹形,这种方法仍然有效。 - Hong
显示剩余2条评论

4

好的,但是如果可能的话,我想避免使用Cocos2D来绘制多边形xD(顺便说一下,使用Cocos2D意味着向最终档案添加了很多大小?我能否只创建一个View放在其他UIView上而没有问题吗?) - Vinzius
您可以使用OpenGL和正常的UIKit,没有任何问题。Cocos2d提供比绘制多边形更多的功能,因此,如果您只需要简单的多边形,那么它是不必要的 :) - Krzysztof Zabłocki
看起来对于没有洞的多边形效率很高(头文件中这么说)。所以我打算研究另一个处理它的C代码^^。如果我编写C => ObjC,我会放置代码。也许稍后或明天会有回应^^。 - Vinzius
我会从这个库开始,尽管它不支持洞,然后转到http://www.cs.unc.edu/~dm/CODE/GEM/chapter.html。A + ;-) - Vinzius

3
在维基百科的多边形三角剖分讨论页面上,我认为更多的三角形实际上会更快。我编写了一个支持孔洞且运行时间为O(n log (n))的三角剖分引擎。我在Gdk下对其进行了测试,然后从中制作了一个Android应用程序。请参考链接triangulation engine

我发现并修复了一些错误,请在尝试之前等待我的下一个提交。 - Nic Roets
我提交了一个新版本。在开始之前,请查看.h文件。 - Nic Roets
还没有尝试过,但很快就会(我必须先完成一份报告)。尝试后我会邮件/私信你;-) - Vinzius

2

你最终的选择是什么?

我最近测试了下面链接中列出的5个库:

http://vterrain.org/Implementation/Libs/triangulate.html

但是它们都不令人满意...

  1. iphone-glu: (http://code.google.com/p/iphone-glu/)

    • 算法中有bug吗?有一些小洞没有被填充,或者有时会在多边形外部绘制
  2. Triangulte: (http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml)

    • 不支持孔...
  3. Triangulation: (http://www.cs.unc.edu/~dm/CODE/GEM/chapter.html)

    • 有缺陷,有时会超出范围,或出现负索引等问题...
  4. poly2tri: (http://code.google.com/p/poly2tri/)

    • 有缺陷,在某些情况下会崩溃
  5. openglespolygon: (https://github.com/nroets/OpenGlEsPolygon)

    • 算法不完美?在多边形边缘上有一些小洞(未填充)

嗨。根据你在帖子中的解释,我没有找到一个好的解决方案...所以目前我尝试不用它。如果你找到任何解决方案,我很感兴趣。 - Vinzius
谢谢。我现在正在使用第三个选项,在修改了一些本地变量初始化错误(初始化为0)后。我不确定是否还有其他错误,但由于它现在在我的项目中没有崩溃,我认为这是我能想到的最好的选择。 (我发现使用stackExchange ID登录Stack Overflow非常困难,这是自注册以来我的第一次成功登录(我将标签固定在Chrome中,以便每次启动Chrome时,它都会尝试登录Stack Overflow...)) - Dong Ma
@DongMa,第三个选项不再允许下载源代码。 - Dmitriy
最终我没有使用任何第三方库。它们中没有一个足够强大,能够满足我的需求。我现在正在使用CoreGraphics,虽然仍在寻找一个轻量级且免费的第三方库... - Dong Ma

0
在非ES OpenGL中,人们倾向于使用GL Utility (glu)库中的细分器。我发现了this project,它旨在使glu可用于iPhone,并声称支持多边形细分 - 如果它能正常工作,那么这将是一个不错的选择。

谢谢,我会看一下看看它是否可以使用 :-) - Vinzius
1
尝试编译该项目,但似乎出现了“一些”问题^^还是谢谢。 - Vinzius
glu镶嵌现已被弃用,非ES OpenGL中实现此功能的现代方法是什么? - Alec Jacobson

0

当您需要对带孔多边形进行三角剖分时,可以尝试使用GPC

有一个名为gpc_polygon_to_tristrip的函数可用于三角剖分。

渲染时请使用GL_TRIANGLE_STRIP

但是请先阅读GPC许可证!


谢谢,我会看一下的;-) - Vinzius

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