opengl API Gdx.gl20 vs Gdx.gl in libgdx v0.9.9
opengl API Gdx.gl20 vs Gdx.gl in libgdx v0.9.9
我正在使用 libgdx 框架,我不确定访问 opengl API 的首选方式是什么,我的应用程序使用 OpenGl 2.0(useGL20 标志设置为 true)。现在要清除例如我可以做的屏幕:
Gdx.gl20.glClearColor(0, 0, 0, 0xff);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
但我也可以:
Gdx.gl.glClearColor(0, 0, 0, 0xff);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);*
当然两者的结果相同,但是一种方式优于另一种方式吗?使用 Gdx.gl20
与 Gdx.gl
时产生的差异是什么?
请注意,在最新版本的libgdx中,openGl 1.x被完全删除,Gdx.gl
只是对Gdx.Gl20
的接口包装。但是我使用的是 libgdx 的旧版本 (v.0.9.9),它仍然支持 openGl 1.x
这取决于您要使用的 opengl 功能,请查看以下主题:
How do I support OpenGL ES GL10, GL11, and GL20 in Libgdx?
编辑:这反映了版本 1.5 并与 OP 所做的编辑冲突,但关于处理版本的部分是正确的
在这种特殊情况下,您可以随意使用任何东西,正如您在 https://github.com/libgdx/libgdx/blob/3f49a73ae24014964db439cd7d98a935dc30f13e/gdx/src/com/badlogic/gdx/Gdx.java 中看到的那样,它们属于同一类型 GL20
。 *)
不过如你所见,还有gl30
。这意味着,不同的 GL 版本支持不同的功能,在 java 中,所有这些功能都捆绑在这个不同的接口中,并由一些 class 支持。实际上,对于像 glClear
这样简单且已有十年历史的函数,这在机器级别上很可能没有任何意义,因为驱动程序中的相同函数迟早会被调用。但是您在代码中使用一个界面而不是另一个界面说明您的应用程序需要特定版本的 GL。
TL;DR:如果您需要 gl2.0 功能,而 3.0 中没有,并且您希望安全起见,请使用 gl20
,因为没有人知道 libgdx 作者将 gl
更改为较新的版本。但现在,它是基线,使用 gl
可以让您安全一些击键。
*)同接口的蜂;这并不意味着它们实际上是完全相同的初始化或由同一个实例支持。
没关系,因为它引用了同一个对象。如果你想在未来支持 GLES 3.0(当它在 libgdx 中完全实现时),我会选择 gl
,这样你以后就不必重构那么多代码了。然后在您的 AndroidLauncher class 中,您可以根据设备功能 select 在您的 ApplicationConfiguration 中选择您想要的(2.0 或 3.0)。您的大部分核心代码甚至不需要知道正在使用哪个;您只需要担心检查使用 3.0 特定功能的地方。
所有版本的 OpenGL 都支持基本功能,但每个新版本的 openGL 都有一些扩展和改进。 运行 下面的代码,看看你能在你的电脑上做什么。
if( app.getGraphics().isGL20Available() )
app.log( "my app", "yay, we can do shaders!" );
if( app.getGraphics().isGL11Available() )
app.log( "my app", "yay, we can use vertex buffer objects" )
if( app.getGraphics().isGL10Available() )
app.log( "my app", "oh crap, stone age time" );
OpenGL ES 1.1 向后兼容 OpenGL 1.0,因此如果 1.1 可用,1.0 也可用。注意:如果 OpenGL ES 2.0 可用,则 OpenGL ES 1.1 和 1.0 都将不可用,反之亦然,因为 1.x 和 2.0 不兼容!
再次注意:当 OpenGL ES 2.0 可用时,Graphics.getGL10() 和 Graphics.getGL11() 将 return 为空,反之亦然。如果 OpenGL ES 1.1 可用,那么您可以获得 GL10 或 GL11 接口。如果只有 OpenGL ES 1.0 可用,则只能获得 GL10 接口。
接口 GL10、GL11 和 GL20 实现了完整的 OpenGL ES 规范。
我正在使用 libgdx 框架,我不确定访问 opengl API 的首选方式是什么,我的应用程序使用 OpenGl 2.0(useGL20 标志设置为 true)。现在要清除例如我可以做的屏幕:
Gdx.gl20.glClearColor(0, 0, 0, 0xff);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
但我也可以:
Gdx.gl.glClearColor(0, 0, 0, 0xff);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);*
当然两者的结果相同,但是一种方式优于另一种方式吗?使用 Gdx.gl20
与 Gdx.gl
时产生的差异是什么?
请注意,在最新版本的libgdx中,openGl 1.x被完全删除,Gdx.gl
只是对Gdx.Gl20
的接口包装。但是我使用的是 libgdx 的旧版本 (v.0.9.9),它仍然支持 openGl 1.x
这取决于您要使用的 opengl 功能,请查看以下主题: How do I support OpenGL ES GL10, GL11, and GL20 in Libgdx?
编辑:这反映了版本 1.5 并与 OP 所做的编辑冲突,但关于处理版本的部分是正确的
在这种特殊情况下,您可以随意使用任何东西,正如您在 https://github.com/libgdx/libgdx/blob/3f49a73ae24014964db439cd7d98a935dc30f13e/gdx/src/com/badlogic/gdx/Gdx.java 中看到的那样,它们属于同一类型 GL20
。 *)
不过如你所见,还有gl30
。这意味着,不同的 GL 版本支持不同的功能,在 java 中,所有这些功能都捆绑在这个不同的接口中,并由一些 class 支持。实际上,对于像 glClear
这样简单且已有十年历史的函数,这在机器级别上很可能没有任何意义,因为驱动程序中的相同函数迟早会被调用。但是您在代码中使用一个界面而不是另一个界面说明您的应用程序需要特定版本的 GL。
TL;DR:如果您需要 gl2.0 功能,而 3.0 中没有,并且您希望安全起见,请使用 gl20
,因为没有人知道 libgdx 作者将 gl
更改为较新的版本。但现在,它是基线,使用 gl
可以让您安全一些击键。
*)同接口的蜂;这并不意味着它们实际上是完全相同的初始化或由同一个实例支持。
没关系,因为它引用了同一个对象。如果你想在未来支持 GLES 3.0(当它在 libgdx 中完全实现时),我会选择 gl
,这样你以后就不必重构那么多代码了。然后在您的 AndroidLauncher class 中,您可以根据设备功能 select 在您的 ApplicationConfiguration 中选择您想要的(2.0 或 3.0)。您的大部分核心代码甚至不需要知道正在使用哪个;您只需要担心检查使用 3.0 特定功能的地方。
所有版本的 OpenGL 都支持基本功能,但每个新版本的 openGL 都有一些扩展和改进。 运行 下面的代码,看看你能在你的电脑上做什么。
if( app.getGraphics().isGL20Available() )
app.log( "my app", "yay, we can do shaders!" );
if( app.getGraphics().isGL11Available() )
app.log( "my app", "yay, we can use vertex buffer objects" )
if( app.getGraphics().isGL10Available() )
app.log( "my app", "oh crap, stone age time" );
OpenGL ES 1.1 向后兼容 OpenGL 1.0,因此如果 1.1 可用,1.0 也可用。注意:如果 OpenGL ES 2.0 可用,则 OpenGL ES 1.1 和 1.0 都将不可用,反之亦然,因为 1.x 和 2.0 不兼容!
再次注意:当 OpenGL ES 2.0 可用时,Graphics.getGL10() 和 Graphics.getGL11() 将 return 为空,反之亦然。如果 OpenGL ES 1.1 可用,那么您可以获得 GL10 或 GL11 接口。如果只有 OpenGL ES 1.0 可用,则只能获得 GL10 接口。
接口 GL10、GL11 和 GL20 实现了完整的 OpenGL ES 规范。