如何在Libgdx中支持OpenGL ES GL10、GL11和GL20?

5
我正在编写一个使用GL10的3D游戏,但是如果可用,我想使应用程序支持GL11或GL20。那么支持全部三种版本的最佳设计是什么?或者这是徒劳无功的,我应该只专注于支持一个版本?
我的当前想法是将render()函数分成renderGL10、renderGL11和renderGL20,并根据可用的GL实例调用适当的渲染函数。每个渲染函数内部是适用于该GL版本的渲染方式;GL10和GL11可能会有重叠。这种解决问题的方法是否合适?还是有更好的方法?
public render(){
  if (Gdx.graphics.isGL20Available()){
    renderGL20();
  } else if (Gdx.graphics.isGL11Available()){
    renderGL11();
  } else { 
    renderGL10();
  }
}

编辑: 解决方案:如果gl1.x可用,则gl10也可用(且Gdx.gl10不为null)。因此,我的渲染代码通常应按以下结构组织:

public render(){
  // Use Gdx.gl for any gl calls common to all versions
  if (Gdx.graphics.isGL20Available()){
    // Use Gdx.GL20 for all gl calls
  } else {
    if (Gdx.graphics.isGL11Available()){
      // Use Gdx.gl11 for any gl11 call not supported by gl10
    } 
    // Use Gdx.gl10 for all gl calls
  }
}
1个回答

10

您在OpenGL ES 2.0路径中实际使用着色器吗?还是依赖于SpriteBatch等工具来处理脏数据的细节?如果是后者,那么采用GLES 2.0没有真正的好处(除了非二次幂纹理,在某些设备上可能更慢)。

通常可以选择GLES 1.x或2.0之间。如果选择1.x,则不必做任何事情。如果要使用2.0,则必须创建一个AndroidApplicationConfig并将useGL20标志设置为true。如果设备不支持GLES 2.0,则libgdx会回退到1.x。然后,您可以使用以上呈现循环,如果可用,则使用GLES 2.0,否则回退到1.x。除非直接使用GLES调用,否则不太可能需要分别为1.0和1.x设置不同路径。


1
我目前并没有使用库的很多绘图部分;我正在探索如何在不了解gles2.0或者libgdx对gl1.x怎么处理的情况下进行设计。我正在利用这个游戏来扩展我的游戏编程和GLES知识,所以我想支持两种模式,这样我可以尝试学习GLSL。根据你有关1.x的回答,我快速查看了Android和Jogl后端的源代码,并发现当gl11可用时,Gdx.gl10=Gdx.gl11;。我预期如果gl11已设置,那么gl10应该为null(就像2.0可用时gl10和gl11都是null一样)。这点和你的回答真的帮了我很大的忙。 - Doran

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