OpenGL — GL_LINE_LOOP --
我正在使用GL_LINE_LOOP在C和openGL中绘制一个圆! 我可以用颜色填充圆圈吗?
如果需要,这是我正在使用的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
查找多边形三角剖分!
我希望这里的内容对某人有用,即使这个问题是在二月份提出的。尽管有很多人不愿回答,但答案还是很多。我可以永远苦恼,但是在那之前我会尽力完成。
有人甚至会说"您永远不会",或者"这不适用于OpenGL",我想对他们说的更多。将多边形转换为OpenGL非常喜欢的三角形不在OpenGL的工作规范范围之内,而且无论如何最好在处理器方面进行。事先尽可能少地计算该阶段,而不是在每次绘制调用时重复发送这样的大块问题。
自2月份以来,最初的提问者可能不再使用OpenGL,或者他们已经成为专家。也许我会再次激发他们重新看待它,以摆脱某些原始的"冒名顶替者"。也许他们会说这毕竟不是他们的工具,但这将令人失望。无论您要编写什么图形代码,您都知道OpenGL可以加快速度!
凸多边形的三角形很容易
你只想要一个圈子吗?以共享点为圆心的原点制作一个三角形扇。不管是好是坏,GL_POLYGON被弃用,然后全部销毁了;它不适用于当前或将来的OpenGL实现。
凹面多边形的三角形很难
以后您会需要更多常规多边形吗?好吧,对于各种凸多边形,您可以使用一些技巧,但是凹多边形很快就会变得困难。无需完成一个解决方案就可以轻松启动五个不同的解决方案。这样一来,很难快速完成,要确保它是最快的,几乎是不可能的。
为了以一种面向未来的方式实现它,您真的想坚持使用三角形-因此,"多边形三角剖分"是您要搜索的主题。 OpenGL将永远是绘制三角形的绝佳选择。三角形条带很受欢迎,因为它们可以重复使用许多顶点,并且整个网格只能用三角形条带覆盖(也许包括奇数个孤立的三角形或一对三角形)。仅使用一个图元进行绘制通常意味着可以通过一次绘制调用来渲染整个网格,这可以提高性能。 (抽签次数是性能方面的考虑因素,但并不总是最重要的。)
当您允许凸多边形或带孔多边形时,多边形三角剖分会变得更加复杂。 (实际上,一个强大而又快速的三角网格查找算法实际上是一个正在进行的研究领域。尽管如此,您仍然可以找到一些非常合适的解决方案,这些解决方案可能适合于此目的。)
但这就是你想要的吗?
填充多边形对OpenGL中的最终目标是否至关重要?还是您只是选择一个简单的早期课程而已?
令人沮丧的是,尽管绘制填充的多边形似乎很简单-的确是许多语言中最简单的事情之一-OpenGL中的解决方案可能非常复杂。当然,只要我们足够聪明,就可以完成此操作-但这可能会花费很多精力,而又不是实现您以后目标的最佳途径。
即使在以易于编程的方式实现填充多边形的语言中,您也并不总是知道它给CPU或GPU造成了多大压力。如果您发送要连接和填充的一系列顶点,那么每个动画帧一次,它会很慢吗?如果多边形不改变形状,也许您应该只执行一次困难的计算?如果使用CPU一次对多边形进行了三角剖分,然后将这些三角形重复发送到OpenGL进行渲染,则将执行此操作。
OpenGL非常善于利用硬件加速,非常快地完成某些事情。值得一提的是,用OpenGL决定实现最终目标的最佳途径是什么,而不是最优方法。
如果您正在寻找简单的早期课程,则旋转鲜艳的四面体是理想的选择,并且在大多数教程中都比较早。
另一方面,如果您正在计划一个当前设想使用填充多边形的项目(例如,一个程式化的卡通渲染引擎),我仍然建议您去学习教程,甚至更多!找一个好人坚持到底然后,您可以更好地考虑可用的和不可用的OpenGL函数。您可以利用什么?您需要什么或想重做软件?是否值得为看起来很简单的事情(例如绘制填充的多边形)编写自己的代码,而这些事情却"错失"了OpenGL(或至少不适用于OpenGL)?
是否有一个更高层次的图形库可以免费使用-也许依赖OpenGL进行栅格化-已经可以满足您的需要?如果是这样,那么它给您带来了多少自由,可以让他们随意使用OpenGL本身的细节呢?
OpenGL非常擅长绘制点,线和三角形,并且硬件可以加速某些常见的操作,例如裁剪,面部剔除,透视图分割,透视图纹理访问(对照明非常有用)等。它为您提供了编写称为着色器的特殊程序的机会,该程序可在渲染管线的各个阶段运行,从而最大程度地增加插入自己独特的技巧的机会,同时仍可利用硬件加速。
一个很好的教程可以解释渲染管道,并使您处于更好的位置来评估OpenGL工具最适合的用途。
这是我最近找到的这样的教程:学习现代3D图形编程
杰森·麦克森(Jason L.它似乎并不完整,但是如果您够到足以使您烦恼的程度,您将可以轻松地搜索其余部分。
使用冒名顶替者填充多边形
计算机图形学中的所有内容都是冒名顶替者,但该术语通常具有专门的含义。冒名顶替者显示出的几何形状与他们实际拥有的几何形状完全不同-仅比平常更大!当然,一个3D世界与代表它的像素有很大不同,但是随着冒名顶替者的欺骗,比通常情况更深。
例如,如果您在OpenGL片段着色器中将自定义的深度值写入深度坐标,计算出自己的法线照明等,然后将其丢弃,则OpenGL实际上由两个三角形构成的矩形可能看起来像是一个球体。落在球体轮廓之外的正方形碎片。 (计算这些碎片的深度将涉及负数的平方根,该平方根可用于丢弃碎片。)此类冒名顶替者有时被称为平板广告牌或广告牌。
(上面的教程包括一章冒名顶替者,以及一些示例,这些示例正是我在此所做的描述。实际上,矩形本身仅是从管道的一部分从单个点构造的。我警告说,矩形的缩放比例,考虑到透视将一个广角视野中的球体扭曲成椭圆形的方式是一种非稳健的软糖,正确而可靠的答案很难解决,因为使用的数学将略微超出本书的范围。会说这超出了作者的代数技能,但我可能错了;他当然会理解一个有效的示例。但是,如果您具有正确的解决方案,则它在计算上不昂贵;仅涉及线性运算加两个平方根,以找到水平或垂直平移的球体的四个极限,要将该技术推广到其他位移,则需要再增加一个平方根,以进行矢量归一化以找到正确的旋转,并应用该r渲染矩形时的otation矩阵。)
因此,为了建议其他人不太可能提供的原始解决方案,您可以使用不等式(例如对于圆来说x * x + y * y <= 1或对于双曲线来说x * x-y * y <= 1 )或不等式系统(例如,将三个直线形式绑定到一个三角形)来决定如何丢弃片段。请注意,如果不等式具有的线性阶以上,则它们可以编码完美的曲线,并使其平滑化,使其达到像素化屏幕所允许的平滑度,而不受曲线"几何细节"的限制。您也可以通过这种方式在单个多边形中组合直线和弯曲边缘。
例如,半圆的片段着色器(将用GLSL编写)可能具有以下内容:
1 2 3 4 | if (y < 0) discard; float rSq = x * x + y * y; if (1 < rSq) discard; // We're inside the semi-circle; put further shader computations here |
但是,以这种方式易于绘制的多边形与您习惯的多边形非常不同。将一系列连接的节点转换为不等式意味着需要编写更多代码,并决定布尔逻辑来处理合并这些不等式,可能会变得非常复杂-尤其是对于凹多边形。以合理的顺序执行不平等,以便可以根据其他人的结果来剔除其中,这是问题的另一个不适当的头痛,即使它很容易将最佳解决方案硬编码为一个通用问题一个像正方形的盒子。
我建议使用冒名顶替者主要是因为它与三角剖分法形成对比。取决于您最终希望实现的目标以及多边形的性质,类似的任一种方法都可以作为追求的途径。
玩得开心...
附言有一个相关的主题...将多边形三角剖分为OpenGL ES的三角带
只要链接持续,它是对"多边形三角剖分"比我更详细的解释。如果链接消失,这就是要搜索的两个单词。
好。
行循环只是一个轮廓。
要同时填充中间部分,您想使用