【问题标题】:Libgdx opengl draw lines exampleLibgdx opengl 画线示例
【发布时间】:2016-03-18 15:31:56
【问题描述】:

请问如何在libgdx中使用opengl画出三条不相连的非正交线?代码 sn-p 非常感谢。 我用谷歌搜索了很多,找到了一个例子(三角形)here,但它被标记为过时并使用网格。

Opengl 教程说我可以这样写:

glBegin(GL_LINES);
    glVertex2f(.25,0.25);
    glVertex2f(.75,.75);
glEnd();

但是我如何从 libgdx 调用这段代码呢?

是否可以在不编写网格和着色器的情况下画线?

即使使用着色器,当我将此代码写入着色器并通过 ShaderProgram() 加载它时,它也只会给出编译错误。

void main()
{
        glVertex2f(.25,0.25);
        glVertex2f(.75,.75);
}

所以,虽然 opengl 教程说我可以调用这个 glVertex2f(.25,0.25),但我不能从着色器中调用它。

Lwjgl 教程在某种程度上引用了 libgdx,例如 herehere,但代码在 libgdx 中不起作用[方法 batch.draw(texture, x, y, width, thickness) 在 libgdx 中几乎不存在]。

ShapeRenderer 对于我的用例来说太慢了。 从 1x1 px 纹理渲染线听起来很合理,但如果我能像上面那样从 libgdx 进行 opengl 调用,那就更好了。谢谢。

UPD:我看到可以通过Gdx.gl.xxx() 引用opengl 方法,但这里没有Gdx.gl.glVertex2f()

【问题讨论】:

  • 你是如何确定 ShapeRenderer 太慢的?
  • 我在场景构建期间解析了一个 svg 图像,然后使用 ShapeRenderer(它也创建一次)绘制它,这会将 fps 从 400 下降到 20-30。我还读到 ShapeRenderer 不缓存任何几何图形,主要用于调试目的。
  • @EugeneS 你能告诉你如何解析 svg 图像并使用 ShapeRenderer 绘制它吗?我有类似的任务,但似乎 libGDX 不支持矢量图形
  • 嗨@dimon!我使用 Sovery 作为基础,在这里查看:badlogicgames.com/forum/viewtopic.php?f=17&t=21333
  • @EugeneS 酷,谢谢!

标签: java opengl libgdx


【解决方案1】:

LibGDX 不能在没有着色器和网格的情况下绘制任何东西(从 1.0 版开始,当 OpenGL ES 1.0 支持被取消时),但大多数绘图类都有内置的默认着色器并在幕后使用网格,所以你不需要不得不担心他们。

你也不能调用像glVertex2f这样的废弃函数,因为LibGDX已经放弃了对OpenGL ES 1.0的支持。 (如果您认为可以从顶点或片段着色器内部调用 OpenGL 函数,那么您误解了着色器的用途。)您链接的三角形教程已过时,因为它不使用现在需要的着色器。

我不确定您如何确定 ShapeRenderer 对于您的目的来说太慢了。如果您打算让您的线条移动,或者您没有将长线条组从头到尾永久链接起来,那么 ShapeRenderer 已经进行了尽可能快的优化。

如果您的线条没有移动,或者您有很多长长的线条链,这些线条永久地首尾相连,那么您可能可以自己使用 Mesh 和 ShaderProgram 类来提高速度.如果您不太熟悉 Meshes 的工作原理,这会有些复杂。您需要使用顶点数组(如果您有很多永久末端连接的线链,则需要一个索引数组)构建一个网格(如果线条不移动,则将其设置为静态)。您还需要为 ShaderProgram 编写一个着色器。那么绘制东西的典型流程是:

//modify the elements of the vertex array as desired to move the lines around.

mesh.setVertices(vertices);
shaderProgram.begin();
shaderProgram.setUniformMatrix("u_projModelView", camera.combined);
mesh.render(shaderProgram, GL20.GL_LINES);
shaderProgram.end();

【讨论】:

  • 感谢您的详细解答。我不介意 LibGDX 在后台调用 Meshes 和 Shaders(如果性能还可以),只是希望通过 OpenGL 函数调用获得简单的解决方案(正如您所说,Mesh 有点复杂,恕我直言,代码不可读)。你是对的,我误解了一些概念,你的回答给了我一个线索来挖掘。我只是想知道为什么在 OGL ES 1.0 中可以在没有着色器的情况下调用 OpenGL 函数,而在 2.0 中则不能?我的图像是带有永久链接的线条的世界 SVG 地图。如果您能提出最佳的绘制方法,我将不胜感激。
  • OpenGL ES 2.0 删除了在可编程函数管道中会变得多余的功能。与桌面 OpenGL 不同,他们决定将其简化而不是完全向后兼容(因为它是用于移动设备的)。如果您查看 ShapeRenderer 和 SpriteBatch 的源代码,您可以相当容易地弄清楚如何在网格上设置顶点。在您的情况下,您可能还需要索引,这将减少网格数据的数量。您可以查看一些基本的 OpenGL 教程,了解它们是如何计算的。
  • 你觉得 ImmediateModeRenderer20 值得一试吗?它的性能如何?谢谢。
猜你喜欢
  • 2014-03-17
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多