【问题标题】:Android OpenGL ES texture animationAndroid OpenGL ES 纹理动画
【发布时间】:2012-01-24 09:44:18
【问题描述】:

我正在为 android 开发一款游戏,这是我第一次使用 OpenGL。 当应用程序加载时,我创建了我的顶点和纹理缓冲区,我从可绘制资源中加载图像;使用 GLUtils.tex2Image2D 将图像绑定到纹理数组。

我想知道 glBindTexture() 是否是在更改纹理以生成动画时使用的正确函数。

public void onDraw(GL10 gl){
    sprite.animate();
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[sprite.frameNumber]);
    sprite.draw(gl);
}

代码说明

sprite.animate() - 根据 System.uptimeMillis() 改变帧数

sprite.draw() - 实际绘图:

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

该功能确实有效,但我想确认它是正确使用的功能,或者是否有其他方法可以做到这一点。

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    将不同的纹理绑定到动画是做你想做的事情的一种方法。

    一种更流行的方法是将所有动画帧放在一个大纹理中(将所有单独的帧打包在一个巨大的矩形中):要绘制不同的帧,只需更改纹理坐标即可。

    例如,将四帧动画打包在一个 2x2 的大正方形中

    1|2
    3|4
    

    然后你将使用纹理坐标 (0,0) (0.5,0) (0.5,0.5) (0,0.5) 来显示第 1 帧,其余的应该是显而易见的。

    【讨论】:

    • 我可以假设我需要多个纹理字节缓冲区吗?在我的绘图函数上使用 gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);在调用 gl.glDrawArrays(); 之前
    • 是的,您需要使用多个纹理坐标缓冲区。您还可以做的是使用所有纹理坐标创建更大的缓冲区,并通过更改 gl.glDrawArrays() 中的第二个参数(要使用的“第一个”点)来指定要使用的缓冲区。请注意,您需要复制顶点信息才能使其正常工作。
    • 如果我正在为纹理生成 mipmap 怎么办?我认为在小尺寸的 mipamp(如 1x1 或 2x2)上,不同的帧可以混合在一起。而glGenerateMipMap() 函数没有指定最小 mipmap 大小的参数。
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2011-04-27
    • 2011-11-12
    • 1970-01-01
    • 2023-03-17
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多