Libgdx gl10.glLineWidth()

8

我有这一行代码: 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) 调用以下函数(我只调用设置颜色和绘制线条):

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的图像 我不知道如何解决这个问题,而且谷歌也没有特别有用的信息。谢谢!

1
OpenGL文档:“当启用线条抗锯齿时,不是所有的线宽都可以被支持。如果请求的宽度不被支持,则会使用最接近的支持宽度。” - arynaq
Libgdx是大多数操作系统上的OpenGL包装器(我认为有一两个不是...可能错了)。好的,很酷,你有任何想法如何使用libgdx关闭它吗?我没有在Gdx.gl10下看到任何东西,那里大多数类似的东西都在,而且谷歌也没有给我展示太多东西,除了Android启动器中的一些内容(这些截图是从桌面上拍摄的),我甚至不知道那是否有效。 - csga5000
1
很抱歉,我没有,只是想指出文档描述了你所看到的行为,这是有意为之的。你可以画一个矩形,它本质上是一条具有给定宽度的线。 - arynaq
是的,但它被旋转了。 显然我可能可以使用tan来旋转它,但是,我仍然喜欢只使用一条线的想法。我们会看看是否有人能帮助我,否则我可能需要旋转一个矩形。无论如何,谢谢! - csga5000
2个回答

6

从libgdx 1.0开始,还有ShapeRenderer的rectLine方法可用。请参见一个简单的示例。

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

现在似乎这是绘制粗线条最简单的方法。


1
救命稻草!使用Shape Renderer类绘制无法使用矩形或多边形实现的对角线粗线。 - kingAm

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之外)在不同平台上具有不同的运行时限制,因此您可能应该使用不同的方案(如矩形)来绘制粗线。

好的,非常感谢。那么我会使用renderer.rotate(point1XYZ,angleToPoint2)函数,然后从point1向右绘制一个长度为distanceToPoint2、给定宽度的矩形? - csga5000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接