OpenGL - GL_LINE_LOOP -

use*_*016 3 c opengl geometry colors

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

Tho*_*ole 8

查找多边形三角剖分!

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

有些人甚至会说,"你永远不会",或者"这不适合OpenGL",我想说的更多的是为什么.将多边形转换为OpenGL喜欢的三角形超出了OpenGL的工作规范,并且无论如何最好在处理器端完成.尽可能少地提前计算该阶段,而不是在每次绘制调用时重复发送这样一个厚实的问题.

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

凸多边形的三角形很容易

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

凹多边形的三角形很难

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

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

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

但这是你想要的吗?

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

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

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

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

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

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

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

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

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

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

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

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

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

因此,为了建议其他人不可能提供的原始解决方案,您可以使用不等式(如x*x + y*y <= 1表示圆形或x*x - y*y <= 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
Run Code Online (Sandbox Code Playgroud)

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

我建议使用冒充者主要是因为它与三角测量方法形成对比.任何一个都可以成为追求的途径,取决于你最终希望实现的目标,以及你的多边形的本质.

玩得开心...


PS有一个相关的主题... 多边形三角剖分为OpenGL ES的三角形条

只要链接持续,它就是"多边形三角剖分"比我的更详细的解释.如果链接死了,那么这两个词就是要搜索的.


use*_*751 7

线环只是一个轮廓.

要填充中间,你想要使用GL_POLYGON.

  • 请注意`GL_POLYGON`仅适用于点的*凸*排列。圆是凸的,但并非所有形状都具有此属性。这当然假设您的实现仍然支持`GL_POLYGON`,因为它已被弃用,最好避免它并学习如何用三角扇之类的东西构建你的圆圈。 (3认同)