android - opengles- 如何呈现动态对象列表并更新每一帧的位置

标签 android opengl-es translate

我正在开发一个适用于 android 的应用程序,该应用程序目前正在使用 Canvas 操作来完成所有绘图,但我将所有内容都切换到 opengles 以获得性能。我唯一的问题是我不知道如何在 opengles 中绘制以显示动态变化的场景。我有几个问题,所以我想我会列出它们。

1.) 如何使用 opengles 基于不断变化的列表动态添加屏幕对象。

2.) 我是否需要将某种列表/数组/对象容器传递给渲染器或 GLSurfaceView 本身。

3.) 如果我想根据更新的位置平移/移动对象,我将如何更新容器中每个对象的实际位置向量。

最佳答案

我认为您已经有了正确的想法。我会将您的容器传递给渲染器,并在每次 onDrawFrame(GL10) 调用时遍历容器并执行绘图。如果您要动态添加对象,也可能值得在容器上进行同步。

在移动对象方面。我假设您将拥有图像纹理以及一个顶点数组,这些顶点数组定义了一个应该在其上绘制纹理的矩形。您可以为每个对象存储矩形的顶点。当“移动”对象时,我可能会建议您简单地改变顶点的值而不是使用平移。

如果您提供更多关于您尝试绘制的对象类型以及您希望何时/如何添加新对象的信息,这可能会有所帮助。

示例代码 fragment :

气泡

public class Bubble{
    float[] boundingBox;
    int textureNumber;

    Bubble(int n){
       textureNumber = n;
       boundingBox[0] = 0; boundingBox[1] = 100; boundingBox[2] = 0;
       boundingBox[3] = 100; boundingBox[4] = 100; boundingBox[5] = 0;
       boundingBox[6] = 0; boundingBox[7] = 0; boundingBox[8] = 0;
       boundingBox[9] = 100; boundingBox[10] = 0; boundingBox[11] = 0;
}

渲染器

ArrayList<Bubble> bubbles;
FloatBuffer bubbleVertexBuffer;

onSurfaceCreated(..){
    ByteBuffer bb = ByteBuffer.allocateDirect(12*4);
    bb.order(ByteOrder.nativeOrder());
    bubbleVertexBuffer = bb.asFloatBuffer();
}

 onDrawFrame(GL10 gl){

   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
   gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
   gl.glColor4f(0.0f, 1.0f, 0.0f,0.0f);

            int size = bubbles.size();
            for(int i = 0; i < size; i++){
                Bubble b = bubbles.get(i);
                bubbleVertexBuffer.put(b.boundingBox);
                bubbleVertexBuffer.position(0);
                gl.glVertexPointer(3, GL10.GL_FLOAT, 0, bubbleVertexBuffer); 
                gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0,4);
            }
        }    

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

 }

关于android - opengles- 如何呈现动态对象列表并更新每一帧的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8721231/

相关文章:

android - 向 AlertDialog.Builder 添加振动

android - 加快文件数组的 MD5 检查

android - 将值传递给 bundle 时出现奇怪的情况

c++ - 将 unsigned char *buf=NULL 翻译成 Pascal?

Angular 5 - 在 TypeScript 中翻译字符串

java - 如何使用 retrofit 3 访问对象内部的 String 值

Android 在 ImageView 中创建一个矩形

java - 三角带三角剖分

ios - openGl ES 纹理渲染

android - 具有旋转、放大、缩小和在 android 中触摸移动的自定义 textview?