gpt4 book ai didi

graphics - 在 OpenGL 中移动 Sprite 的最佳方式 - 平移或改变顶点

转载 作者:行者123 更新时间:2023-12-04 20:19:17 25 4
gpt4 key购买 nike

我正在使用 openGL ES 为 android 创建一个应用程序。我试图在 2D 中绘制许多在屏幕上弹跳的移动 Sprite 。

假设我在坐标 100,100 处有一个球。球图形是 10px 宽,因此我可以创建顶点 boundingBox = {100,110,0, 110,110,0, 100,100,0, 110,100,0}并对 onDrawFrame() 的每个循环执行以下操作加载了球纹理。

//for each ball object
FloatBuffer ballVertexBuffer = byteBuffer.asFloatBuffer();
ballVertexBuffer.put(ball.boundingBox);
ballVertexBuffer.position(0);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ballVertexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0,4);

然后我会更新 boundingBox阵列以在屏幕上移动球。

或者,我无法更改 bounding box完全没有,而是 translatef()绘制顶点之前的球
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ballVertexBuffer); 
gl.glPushMatrix();
gl.glTranslatef(ball.posX, ball.posY, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0,4);
gl.glPopMatrix();

在这种情况下,就高效和最佳实践而言,最好的做法是什么?

最佳答案

OpenGL ES(从 2.0 开始)确实 不是 支持实例化,不幸的是。如果是这样,我会建议绘制一个实例化 N 次的 2 三角形 Sprite ,读取中心点的 x/y 偏移,如果您需要不同大小的 Sprite ,可能还有一个缩放值,来自顶点纹理(ES 支持就好了)。这会将每帧必须推送的数据量限制到最低限度。

假设你不能直接在 GPU 上进行模拟(从而避免每帧上传顶点数据)......这基本上只剩下一个有效的选择:
生成 2 个 VBO,映射一个并填充它,而另一个用作绘制调用的来源。如果您 glBufferData(... 0),您似乎也可以使用单个缓冲区执行此操作在两者之间,它告诉 OpenGL 生成一个新缓冲区,并在完成读取后立即丢弃旧缓冲区。

在每一帧中流式传输顶点可能不是非常快,但是只要延迟可以很好地隐藏(例如,通过从一个缓冲区中绘制同时填充另一个缓冲区),这并不重要。很少有绘制调用,很少有状态变化,理想情况下没有停顿应该仍然可以使这个速度很快。

关于graphics - 在 OpenGL 中移动 Sprite 的最佳方式 - 平移或改变顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472234/

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