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