【问题标题】:Can I use glScale on GL_POINTS?我可以在 GL_POINTS 上使用 glScale 吗?
【发布时间】:2019-07-31 09:45:51
【问题描述】:

我正在用 lwjgl(opengl for java)编写一个 GUI 框架。我最近通过渲染几个被圆圈包围的普通矩形来实现圆角矩形。为了渲染圆圈,我使用了 GL11.GL_POINTS。我现在已经到了尝试实现动画和窗口打开动画的地步,我决定将 GL11.glScaled() 从小到正常。这很好用,但不幸的是我的圈子没有调整大小。

我尝试将我的 GL_POINTS 圆形渲染方法更改为使用 TRIANGLE_FAN 的方法,并且效果很好。我的问题是,圆圈看起来一点也不光滑和圆润,如果我增加渲染的三角形,它开始很快滞后。虽然我的电脑一点也不差。

这是我用来用 GL_POINTS 渲染圆圈的代码。

        GL11.glEnable(GL11.GL_POINT_SMOOTH);
        GL11.glHint(GL11.GL_POINT_SMOOTH_HINT, GL11.GL_NICEST);
        GL11.glPointSize(radius);
        GL11.glBegin(GL11.GL_POINTS);
        GL11.glVertex2d(x, y);
        GL11.glEnd();
        GL11.glDisable(GL11.GL_POINT_SMOOTH);

这是我用来缩放圆圈的代码

        GL11.glPushMatrix();
        GL11.glTranslated(x, y, 0);
        GL11.glScaled(2.0f, 2.0f, 1);
        GL11.glTranslated(-x, -y, 0);
        render circles
        GL11.glPopMatrix();

我希望圆圈根据我放入 glScaled() 的数字进行缩放

目前它们根本没有重新缩放,只是以正常大小呈现。

【问题讨论】:

    标签: java opengl lwjgl opengl-compat


    【解决方案1】:

    以下是如何使用三角扇正确渲染圆形的演示:

    public void render() {
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glLoadIdentity();
        // Coordinate system starts out as screen space coordinates
        glOrtho(0, 400, 300, 0, 1, -1);
        glColor3d(1, 0.5, 0.5);
        renderCircle(120, 120, 100);
        glColor3d(0.5, 1, 0.5);
        renderCircle(300, 200, 50);
        glColor3d(0.5, 0.5, 1);
        renderCircle(200, 250, 30);
    }
    
    private void renderCircle(double centerX, double centerY, double radius) {
        glPushMatrix();
        glTranslated(centerX, centerY, 0);
        glScaled(radius, radius, 1);
        // Another translation here would be wrong
        renderUnitCircle();
        glPopMatrix();
    }
    
    private void renderUnitCircle() {
        glBegin(GL_TRIANGLE_FAN);
        int numVertices = 100;
        double angle = 2 * Math.PI / numVertices;
        for (int i = 0; i < numVertices; ++i) {
            glVertex2d(Math.cos(i*angle), Math.sin(i*angle));
        }
        glEnd();
    }
    

    输出图像:

    GL_POINT_SIZE 值实际上是以屏幕上的像素 为单位的点的大小,而不是当前的坐标单位。因此,您的圈子不受 GL_SCALE 的影响。这是不使用 GL_POINTS 渲染圆圈的原因之一。另一个(可以说更重要的)原因是 GL_POINT_SIZE 在较新的 OpenGL 配置文件中被严重弃用且不受支持。

    【讨论】:

    • 是的,这与我使用 TRIANGLE_FAN 渲染圆圈的方式非常接近。尽管如此,如果圆圈真的很小,它们看起来并不平滑和锐利。无论如何,这就是我正在寻找的答案,因为我不知道 GL_POINT_SIZE 定义了屏幕上的像素大小。谢谢!
    猜你喜欢
    • 2011-06-17
    • 2020-10-12
    • 2011-02-08
    • 2019-08-07
    • 2020-08-12
    • 2016-03-18
    • 2011-02-16
    • 2016-02-26
    • 2016-12-29
    相关资源
    最近更新 更多