OpenGL - GL_LINE_LOOP -

时间:2014-02-27 03:28:04

标签: c opengl colors geometry

我正在使用GL_LINE_LOOP在C和openGL中绘制一个圆圈!我可以用颜色填充圆圈吗?

如果需要,这是我正在使用的代码:

        const int circle_points=100;
        const float cx=50+i, cy=50+x, r=50;
        const float pi = 3.14159f;
        int i = 50;

        glColor3f(1, 1, 1);
        glBegin(GL_LINE_LOOP);

        for(i=0;i<circle_points;i++)
        {
            const float theta=(2*pi*i)/circle_points;
            glVertex2f(cx+r*cos(theta),cy+r*sin(theta));
        }
        glEnd();

2 个答案:

答案 0 :(得分:8)

查找多边形三角剖分!

我希望这里的某些内容在某种程度上对某些人有用,即使这个问题是在2月份提出的。有很多答案,即使很多人都不会给出答案。我可以永远保持干扰,但我会在此之前尝试完成。

有些人甚至会说,&#34;你永远不会,&#34;或者,&#34;那不适合OpenGL,&#34;我想说的更多关于为什么的话。将多边形转换为OpenGL喜欢的三角形超出了OpenGL的工作规范,并且无论如何最好在处理器端完成。尽可能少地提前计算该阶段,而不是在每次抽奖时重复发送这样一个粗糙的问题。

也许最初的提问者从2月开始就离开了OpenGL,或者他们可能已成为专家。也许我会重新激励他们再次看一眼,去抨击一些原创的冒名顶替者。或者他们可能会说它毕竟不是他们的工具,但那会令人失望。无论你编写什么图形代码,你都知道OpenGL可以加速它!

凸多边形的三角形很容易

你只想要一个圆圈?使用圆形原点上的共享点制作三角扇。无论好坏,GL_POLYGON都被弃用了,然后完全被杀掉了;它不适用于当前或未来的OpenGL实现。

凹多边形的三角形很难

您以后会想要更多普通多边形吗?嗯,你可以使用一些技巧,对于各种凸多边形,但凹形很快就会变得困难。如果不完成一个解决方案就很容易启动五种不同的解决方案。然后在完成一个时很难快速完成,而且几乎不可能确保它是最快的。

为了以未来的方式实现它,你真的想要坚持三角形 - 所以&#34;多边形三角测量&#34;是您要搜索的主题。 OpenGL总是非常适合绘制三角形。三角形条带很受欢迎,因为它们可以重复使用许多顶点,并且整个网格可以仅覆盖三角形条带(可能包括奇数孤立三角形或一对三角形)。仅使用一个基元绘制通常意味着可以使用单个绘制调用渲染整个网格,可以提高性能。 (绘制调用的数量是一个性能考虑因素,但并不总是最重要的。)

当允许凸多边形或带孔的多边形时,多边形三角剖分会变得更复杂。 (寻找一般多边形三角测量的算法,实际上是一个持续研究的领域。尽管如此,你可以找到一些可能适合目的的非常好的解决方案。)

但这是你想要的吗?

填充多边形对于OpenGL中的最终目标至关重要吗?或者您只是选择了一个简单的早期课程?

令人沮丧的是,虽然绘制一个填充多边形似乎是一件简单的事情 - 而且确实是许多语言中最简单的事情之一 - 但OpenGL中的解决方案可能会非常复杂。当然,如果我们足够聪明,就可以做到 - 但这可能需要付出很多努力,而不是迈向后期目标的最佳途径。

即使在以易于编程的方式实现填充多边形的语言中,您也始终不知道它对CPU或GPU造成了多大的压力。如果你发送一系列顶点,要链接和填充,每个动画帧一次,它会慢吗?如果多边形没有改变形状,也许你应该只进行一次计算的困难部分?如果你使用CPU对多边形进行三角测量,那么你将会这样做,然后重复将这些三角形发送到OpenGL进行渲染。

OpenGL非常非常擅长做某些事情,非常快,利用硬件加速。值得欣赏的是,通过OpenGL确定实现最终目标的最佳途径并不是最佳选择。

如果你正在寻找一个简单的早期课程,旋转颜色鲜艳的四面体是理想的,并且在大多数教程中都会发生。

另一方面,如果你正在计划一个你目前设想使用填充多边形的项目 - 例如,一个风格化的卡通渲染引擎 - 我仍然建议去教程,甚至更多所以!找个好人;坚持到底;然后,您可以更好地思考OpenGL函数,这些函数对您来说是不可用的。你能利用什么?您需要或想要在软件中重做什么?是否值得为明显简单的事情编写自己的代码 - 比如绘制填充的多边形 - 这些代码是“缺少的”。 (或者至少不适合)OpenGL?

是否有更高级别的图形库,可以免费使用 - 可能依赖OpenGL进行光栅化 - 可能已经想要你想要了吗?如果是这样,它会给你多少自由,搞乱OpenGL本身的细节?

OpenGL非常擅长绘制点,线和三角形,以及硬件加速某些常见操作,如剪裁,面部剔除,透视分割,透视纹理访问(对照明非常有用)等。它为您提供了编写着色器的特殊程序的机会,这些程序可以在渲染管道的各个阶段运行,最大限度地提高您在利用硬件加速的同时插入自己独特的聪明才智的机会。

一个好的教程是一个解释渲染管道的教程,让您更好地评估OpenGL的工具最适合的用途。 这是我最近发现的一个这样的教程:Learning Modern 3D Graphics Programming by Jason L. McKesson。它似乎并不完整,但如果你足够让它惹恼你,那么你就可以找到其余的了。

使用冒名顶替者填充多边形

计算机图形学中的所有内容都是冒名顶替者,但这个术语通常具有特定含义。 Imposters显示出与实际不同的几何形状 - 只比通常更多!当然,3D世界与代表它的像素非常不同,但是对于冒名顶替者来说,欺骗行为比平常更深。

例如,OpenGL实际构造出两个三角形的矩形可以看起来像一个球体,如果在其片段着色器中,您将自定义深度值写入深度坐标,计算自己的法线等等,以及丢弃那些落在球体轮廓之外的正方形碎片。 (计算这些片段的深度将涉及负数的平方根,可用于丢弃片段。)像这样的冒名者有时被称为平卡或广告牌。

(上面的教程包括一个关于冒名顶替者的章节,以及我刚才在这里描述的例子。事实上,矩形本身只是从一个点开始在管道的一部分构建。我警告为了解释透视在宽FOV中将球体扭曲成椭圆的方式,它们的矩形缩放是一个非强大的软糖。正确而强大的答案很难解决,使用稍微超出本书范围的数学。我说它超出了作者的代数技能,但我可能是错的;他当然理解一个有用的例子但是,当你有正确的解决方案时,它在计算上很便宜;它只涉及线性操作加上两个平方根,以找到水平或垂直平移球体的四个极限。为了推广该技术用于其他位移需要一个以上平方根,用于矢量归一化以找到正确的旋转,以及渲染矩形时旋转矩阵的一个应用。)

因此,只是建议其他人不可能提供的原始解决方案,您可以使用不等式(如x * x + y * y <= 1表示圆形或x * x - y * y &lt; = 1表示双曲线)或不等式系统(如三个直线形式来绑定三角形)以决定如何丢弃一个片段。请注意,如果不等式具有多于线性的顺序,它们可以编码完美的曲线,并且像您的像素化屏幕一样平滑地渲染它们 - 不受“几何细节”的限制。的曲线。您也可以通过这种方式将直边和弯曲边组合在一个多边形中。

例如,半圆的片段着色器(用GLSL编写)可能有这样的东西:

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

然而,以这种方式易于绘制的多边形与您习惯使用的多边形非常不同。将一系列连通节点转换为不等式意味着要编写更多代码,并决定布尔逻辑,以处理这些不等式的组合,然后可能变得非常复杂 - 特别是对于凹多边形。以合理的顺序执行不等式,以便根据其他人的结果可以剔除某些不平等,这是一个问题的另一个不适当的头痛,如果它需要是一般的,即使很容易硬编码最佳解决方案像广场一样的单个案例。

我建议使用imposters主要用于与三角测量方法的对比。任何一种东西都可以成为追求的途径,取决于你最终希望实现的目标,以及你的多边形的本质。

玩得开心......


P.S。有一个相关的主题...... Polygon triangulation into triangle strips for OpenGL ES

只要链接持续,就可以更详细地解释多边形三角剖分&#39;比我的。如果链接死了,那么这两个词就是要搜索的。

答案 1 :(得分:7)

线环只是一个轮廓。

要填补中间位置,您还想使用GL_POLYGON