gpt4 book ai didi

android - 如何在 OpenGL ES 2.0 中管理多个纹理?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:30:34 24 4
gpt4 key购买 nike

我有一个具有 6 种不同纹理的 OpenGL ES 2.0 应用程序。我需要的是同时绘制和移动它们。我能够做到,但是 Action 很慢,因为我一直在将位图加载到纹理中。对于每个纹理,我在 Render 方法上执行以下操作:

    setupImage(texture1);
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, vertexBufferT1);
GLES20.glVertexAttribPointer(mTexCoordLoc, 2, GLES20.GL_FLOAT, false, 0, uvBufferT1);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indicesT1.length, GLES20.GL_UNSIGNED_SHORT, drawListBufferT1);

在 setupImage 方法上,我这样做:

    // Create the bitmap
int id = mContext.getResources().getIdentifier("drawable/texture1", null, mContext.getPackageName());
Bitmap bmp = BitmapFactory.decodeResource(mContext.getResources(), id);

// Bind texture to texturename
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);

// Set filtering
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

// Set wrapping mode
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

// Load the bitmap into the bound texture.
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

// Free bitmap
bmp.recycle();

这显然是错误的。但是,我不知道如何将每个位图加载到不同的纹理中,然后如何在 Render 方法上切换 Activity 纹理。

那么,我怎样才能实现这一点,以便显示和移动所有六个纹理并进行流畅的运动?

最佳答案

你是对的,你这样做很浪费。维护纹理的一种简单方法是以更智能的方式简单地使用 textures[] 数组。

有没有想过为什么这个变量是一个大小为 1 的数组?好吧,你可以用它来容纳超过 1 个纹理!只需将其定义为更大的数组(适合您的大小为 6)。执行此操作后,您将能够在应用程序启动时将多个位图加载到纹理中,然后在您要绘制它时绑定(bind)正确的纹理。

这是一个例子:

private int[] textures = new int[6];

private void loadTexture(Bitmap bitmap, int textureIndex) {
GLES20.glGenTextures ( 1, textures, textureIndex );

GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, textures[textureIndex] );

//.. call glTexParameter as needed

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
}

上面的代码应该被调用一次,当应用程序启动时,对于你想要作为纹理加载的每个位图。如果您有很多位图,您可能需要考虑某种即时纹理加载和卸载 - 但根据您的需要,一次加载它们就足够了。

稍后,当您要绘制某个纹理时,请确保首先绑定(bind)正确的纹理:

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[textureIndex]);

这将简单地告诉 OpenGL 层它将为即将到来的绘制调用使用哪个预加载纹理。请务必在每次绘制之前调用它,以确保每次绘制正确的纹理。请注意,此时 OpenGL 不会重新创建整个纹理,而是只使用已经加载的纹理,因此非常高效。

关于android - 如何在 OpenGL ES 2.0 中管理多个纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36036068/

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