7

我有这条线: Gdx.gl10.glLineWidth(width); 现在,我确实打算画一条很粗的线,不幸的是,当我输入像 1 或 5 这样的小值时,这条线显然很小。但是一旦我超过了 10 左右,它就不再变大了。在这些情况下,我传递的是直接值,因此,我的印象是 GL 有限制或其他东西......我是对的吗?这是我的代码:

Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    batch.setProjectionMatrix(cam.combined);
    batch.begin();
    batch.draw(bg,0,0,WIDTH,HEIGHT);
    for(Spell a : spells){
        a.draw(batch);
    }
    lc.draw(batch);
    batch.end();
    //((ppux+ppuy)/2f)*4
    Gdx.gl10.glLineWidth(50);//average and then say 1/4 a unit)
    renderer.setProjectionMatrix(cam.combined);
    renderer.begin(ShapeType.Line);
    lp.drawLines(renderer);
    renderer.end();
    batch.begin();
    lp.draw(batch);
    batch.end();

lp.drawLines(renderer) 调用以下内容(我只是调用 set color 和 draw line):

renderer.setColor(1,1,1,1);
    Elem a = elems.get(spellcombo.get(0));
    Vector2 last = new Vector2(a.x(),a.y());
    for(int i = 1; i < spellcombo.size(); i++){
        a = elems.get(spellcombo.get(i));
        Vector2 cur = new Vector2(a.x(),a.y());
        renderer.line(last.x, last.y, cur.x, cur.y);
        last = cur;
    }
    renderer.line(last.x,last.y,mx,my);
    Gdx.gl.glEnable(GL10.GL_BLEND);
    Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    renderer.setColor(1, 0, 0, .2f);
    for(Elem e : elems){
        int id = elems.indexOf(e);
        if(ComboManager.validSpell(spellcombo,id))
            renderer.line(last.x,last.y,e.x(),e.y());
    }

屏幕截图:
glLineWidth() 设置为 1 glLineWidth() 设置为 1 的图像 的图像 glLineWidth() 设置为 5 glLineWidth() 设置为 5 的图像 的图像 glLineWidth() 设置为 10 glLineWidth() 设置为 10 的图像 的图像 glLineWidth() 设置为 20 glLineWidth() 设置为 20 的图像 的图像 glLineWidth() 设置为 200 的图像 glLineWidth() 设置为 200 的图像

我真的不知道如何解决,谷歌也不是特别有帮助。谢谢!

4

2 回答 2

5

从 libgdx 1.0 开始,还有ShapeRenderer 的 rectLine 方法可用。看一个简单的例子。

ShapeRenderer shapeRenderer = new ShapeRenderer();
shapeRenderer.begin(ShapeType.Filled);
shapeRenderer.rectLine(x1, y1, x2, y2, width);
shapeRenderer.end();

这似乎是现在画粗线的最简单方法。

于 2014-09-22T18:14:44.780 回答
3

在 Libgdx 中,Gdx.gl10对象是 OpenGL 1.x API 的包装器。因此,所有(基本上)调用都是对 OpenGL ES(在 Android 上)或常规 OpenGL(在桌面上)的调用。有时 Java 层会更改 API,但通常它是一个非常简单的映射。(在桌面上,Libgdx 尝试模拟 ES 变体,因此提供的 API 仅包含与 ES 相关的 API。)

OpenGL ES 中的线条绘制支持是 ES 与常规 OpenGL 不同的地方。两者都对支持的线宽有限制,尽管在常规 OpenGL 中,这些限制似乎只适用于抗锯齿线。

常规 OpenGL

http://www.opengl.org/sdk/docs/man/xhtml/glLineWidth.xml

有一系列支持的线宽。只保证支持宽度 1;其他的取决于实施。要查询支持的宽度范围,请使用参数 GL_ALIASED_LINE_WIDTH_RANGE 调用 glGet。

OpenGL ES

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glLineWidth.xml

有一系列支持的线宽。只保证支持宽度 1;其他的取决于实施。要查询支持的宽度范围,请使用参数 GL_ALIASED_LINE_WIDTH_RANGE 调用 glGet。

要查询 Libgdx 中的限制,请使用以下内容:

int[] results = new int[1];
Gdx.gl10.glGetIntegerv(GL20.GL_ALIASED_LINE_WIDTH_RANGE, results, 0); 

所有这一切的结果是,因为 OpenGL ES 上的线条绘制(宽度 1.0 除外)在不同平台上具有不同的运行时限制,您可能应该使用不同的方案(如矩形)来绘制粗线。

于 2013-05-22T13:27:29.013 回答