【问题标题】:OpenGL for OSX not perfect circumferencesOSX的OpenGL不是完美的圆周
【发布时间】:2017-12-20 02:48:12
【问题描述】:

我正在开发一个应用程序,该应用程序使用 OpenGL for Mac 中的颜色深度进行选择。选择效果很好,但我观察到 OpenGL 没有画出完美的圆(circunferences)。我使用 GL_LINE_LOOP 来渲染 360 段以完成一个紧密的循环。但是,如果我在 SELECTION 模式下看到渲染,我会在圆周上观察到某种咬痕(白色三角形),每个圆圈总共有 4 个咬痕。

是 OpenGL 问题还是我做错了什么?

这是绘制每个圆的代码。

glLineWidth(10.0f); // Exaggerated for image.
glBegin(GL_LINE_LOOP);
    for (int i = 0; i <= 360; i++) {

        calcX = radio * cos((i * M_PI) / 180) + offset_x;
        calcY = radio * sin((i * M_PI) / 180) + offset_y;
        glVertex3f(calcX, calcY, offset_z);
    }
glEnd();

【问题讨论】:

  • 看起来线条的末端几乎是这样倾斜的......
  • 图形硬件可以(并且确实)在渲染线条的方式上有所不同,尤其是宽线条。根据您的硬件,它可能会通过移动线的坐标来渲染多条一像素宽的线来绘制宽线。您展示的最佳方法可能是呈现椭圆形状的三角形条带,使其宽度与您所需的线宽相匹配。它也可能比宽线渲染得更快(现代硬件更喜欢渲染三角形)。

标签: objective-c macos opengl


【解决方案1】:

感谢“radical7,建议使用三角形而不是线条。我能够获得完美的 RING,工作起来很流畅。

这是代码:

        color = 0.00277778;
        glBegin(GL_TRIANGLE_STRIP);

        for (int i = 0; i <= 360; i++) {

            glColor4f(color, 0, 0, 1.0f);
            calcX = radio * cos((i * M_PI) / 180) + offset_x;
            calcY = radio * sin((i * M_PI) / 180) + offset_y;
            glVertex3f(calcX, calcY, offset_z);
            radio +=20;

            calcX = radio * cos((i * M_PI) / 180) + offset_x;
            calcY = radio * sin((i * M_PI) / 180) + offset_y;
            glVertex3f(calcX, calcY, offset_z);
            radio -=20;

            color += 0.00277778;
        }
        glEnd();

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2017-04-12
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多