【问题标题】:How can I fill a java Shape in OpenGL如何在 OpenGL 中填充 java 形状
【发布时间】:2021-12-12 11:05:20
【问题描述】:

好吧,假设我有一个 O 的形状,我想渲染它。

现在我当前的渲染代码是这样的:

public void fill(Shape shape, float xOffset, float yOffset) {
        AffineTransform transform = new AffineTransform();
        transform.translate(xOffset, yOffset);
        PathIterator pi = shape.getPathIterator(transform, 1);
        int winding = pi.getWindingRule();
        ShapeRenderer r = getInstance();
        float[] coords = new float[6];
        boolean drawing = false;
        while (!pi.isDone()) {
            int segment = pi.currentSegment(coords);
            switch (segment) {
            case PathIterator.SEG_CLOSE:
                if (drawing) {
                    r.endPoly();
                }
                break;
            case PathIterator.SEG_LINETO:
                r.lineTo(coords);
                break;
            case PathIterator.SEG_MOVETO:
                if (drawing) {
                    r.endPoly();
                }
                drawing = true;
                r.beginPoly(winding);
                r.moveTo(coords);
                break;
            default:
                throw new IllegalArgumentException("Unexpected value: " + segment);
            }
            pi.next();
        }
    }

ShapeRenderer:

private final Deque<Queue<Float>> vertices = new ConcurrentLinkedDeque<>();

    @Override
    public void beginPoly(int windingRule) {
    }

    @Override
    public void endPoly() {
        Queue<Float> q;
        GL11.glBegin(GL11.GL_LINE_LOOP);
        while ((q = vertices.poll()) != null) {
            Float x, y;
            while ((x = q.poll()) != null && (y = q.poll()) != null) {
                GL11.glVertex2f(x, y);
            }
        }
        GL11.glEnd();
    }

    @Override
    public void moveTo(float[] vertex) {
        Queue<Float> q = new ConcurrentLinkedQueue<>();
        vertices.offer(q);
        lineTo(vertex);
    }

    @Override
    public void lineTo(float[] vertex) {
        Queue<Float> q = vertices.peekLast();
        q.offer(vertex[0]);
        q.offer(vertex[1]);
    }

所以假设我想填充那个形状,就像 java awt 一样,成功......我该怎么做? (已经尝试使用 GL_POLYGON,但它只是填充了整个 O,我有一个实心圆圈,而不是 O。还尝试使用 jogamp glu 的一部分,但它什么也没渲染,不知道为什么)

【问题讨论】:

    标签: java opengl lwjgl java-2d


    【解决方案1】:

    已经尝试使用 GL_POLYGON,但它只是填满了整个 O,我有一个实心圆圈,“

    当然可以。 GL_POLYGON 用于 Convex 形状并填充由多边形包围的整个区域。

    你有两个选择:

    1. 使用GL_POLYGON 两次绘制一个白色形状,然后在白色形状内绘制一个红色形状。

    2. 使用GL_TRIANGLE_STRIP 并形成一个仅绘制轮廓的形状。可以通过在外轮廓和内轮廓上交替指定一个点来形成图元。

    【讨论】:

    • 是的,虽然已经在那个区域创建了三角形,但问题是我想在其中绘制 PathIterator 的 java 部分,所以我不能确保内环有尽可能多的顶点因为外部和形状也可以随着多个孔等而变化。我只是不知道从哪里开始。查看 java awt 代码,我发现了 ShapeSpanIterator,我认为它可以满足我的需要,但它是一堆我不太了解的本机代码
    • @DasBabyPixel 我明白了。但这不是 OpenGL 的问题。在 Java 中找到一个可以填充点数组的算法只是一个问题。
    • 从来没有说过这是 OpenGL 的问题,我只是说我需要一些方法来在 OpenGL 中填充 java 形状
    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2017-03-13
    • 2016-02-20
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多