gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:08:23 29 4
gpt4 key购买 nike

我正在开发一个适用于 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com