【问题标题】:Libgdx gl10.glLineWidth()Libgdx gl10.glLineWidth()
【发布时间】:2013-05-16 20:43:59
【问题描述】:

我有这行: Gdx.gl10.glLineWidth(宽度); 现在,我确实打算画一条很粗的线,不幸的是,当我输入像 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) 调用如下(我只是调用设置颜色和画线):

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() 设置为 5 的图像 glLineWidth() 设置为 10 的图像 glLineWidth() 设置为 20 的图像 glLineWidth() 设置为 200 的图像

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

【问题讨论】:

  • OpenGL docs "启用线条抗锯齿时,并非所有宽度都可以支持。如果请求不支持的宽度,则使用最接近的支持宽度。"
  • Libgdx 是大多数操作系统上的一个 openGL 包装器(我认为有一两个不是...可能是错的)好吧,很酷,你知道我将如何使用它libgdx?我没有在 Gdx.gl10 下看到任何东西,这是大多数类似的东西,谷歌没有向我展示任何东西,除了 android 启动器中的一些东西(这些屏幕截图来自桌面),我没有甚至不知道这是否可行..
  • 不,不幸的是我没有,只是想指出文档描述了您所看到的行为,这是出于某种原因。你可以画一个矩形,它本质上是一条具有给定宽度的线。
  • 是的,但它是旋转的。显然我可以使用棕褐色来旋转它,但是,我仍然喜欢只使用一条线的想法。我们会看看是否有人可以帮助我,否则,我可能不得不旋转一个矩形。无论如何,谢谢!

标签: java libgdx


【解决方案1】:

在 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 得到支持;其他的取决于实施。要查询 支持的宽度范围,使用参数调用 glGet GL_ALIASED_LINE_WIDTH_RANGE。

OpenGL ES

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

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

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

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

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

【讨论】:

  • 好的,谢谢。所以我会使用 renderer.rotate(point1XYZ,angleToPoint2) 然后从 point1 向右绘制一个长度为 distanceToPoint2 和给定宽度的矩形?
【解决方案2】:

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

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

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

【讨论】:

  • 救命!用于绘制无法使用矩形实现的对角粗线。或仅使用形状渲染器类的多边形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多