Android~从GLSurfaceView.Renderer中解耦绘制的对象

时间:2014-03-12 13:26:56

标签: android opengl-es

我正在尝试在Android上学习OpenGL ES 2.0,但在所有教程中我都看到人们在Renderer本身(或onSurfaceCreate()方法)中创建了FloatBuffers和Textures。

就我个人而言,我认为所有这些东西都必须在Renderer类中才真的很难看。我宁愿在GLSurfaceView.Renderer中使用Draw(Sprite sprite)方法,以便Sprite保存Texture和顶点数据。我只是不知道这是怎么可能的以及如何做到这一点。

有没有人对Sprite类有一个想法(或引用),它可以很容易地传递给渲染器并被绘制?

非常感谢,

基督教

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点。一个人将拥有一个sprite接口,然后使用sprite对象创建具体的类。在该界面中,您只需要一种方法来获取纹理。

public interface Sprite {
   public void createTexture();

   public int getTexture();
}

public class MySprite implements Sprite {
    private int[] spriteTexture = int[1];

    public void createTexture() {
       GLES20.glGenTextures(1, spriteTexture, 0);
       GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, spriteTexture[0]);
       //Set your texture params
       //Set your image to the texture
    }

    public int getTexture() {
      return spriteTexture[0];
    }
}

然后您在渲染器中的绘图代码只需访问所需的精灵。

//Setup program to draw with
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mySprite.getTexture());
//Rest of rendering code

另一种选择是将所有绘图代码放在Sprite类中,但由于Sprite之间的大部分内容都是相同的,你可能会以重复的代码结束,当然解决这个问题的方法之一就是拥有一个抽象的BaseSprite处理大多数绘图调用并访问Sprite纹理的类。

你的GLES20调用可以在代码中的任何地方生活,唯一需要考虑/记住的重要事情是你需要在调用它们之前创建opengl上下文,并且需要从同一个线程调用它们,因为每个线程得到它自己的背景。