我可以在 GL_POINTS 上使用 glScale 吗?

Can I use glScale on GL_POINTS?

我正在用 lwjgl(java 的 opengl)编写 GUI 框架。我最近通过渲染几个被圆圈包围的普通矩形来实现圆角矩形。为了渲染我使用 GL11.GL_POINTS 的圆圈。我现在达到了我正在尝试实现动画的地步,并且对于 window 打开动画,我决定 GL11.glScaled() 它从小到正常。效果很好,但不幸的是我的圈子没有调整大小。

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

这是我用 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() 中输入的数字进行缩放

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

这里演示了如何使用三角扇正确渲染一个圆:

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 配置文件中被严重弃用并且不受支持。