android - 在 OpenGL ES 2.0 的显示函数中生成纹理

标签 android opengl-es opengl-es-2.0

我可以在 OpenGL ES 2.0 中 GLSurfaceRenderer 的函数 onDrawFrame 中生成纹理吗?例如,我使用的代码如下所示。

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, MyTexture);

int[] mNewTexture = new int[weight * height * 4];
for(int ii = 0; ii < weight * height; ii = ii + 4){
    mNewTexture[ii]   = 127;
    mNewTexture[ii+1] = 127;
    mNewTexture[ii+2] = 127;
    mNewTexture[ii+3] = 127;
}

IntBuffer texBuffer = IntBuffer.wrap(mNewTexture);
GLES20.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, weight, height, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, texBuffer);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

pmF.drawSelf(MyTexture);

而代码中的类pmF是用来使用纹理渲染屏幕的。我注意到这段代码被执行了。但是屏幕上没有显示结果。

最佳答案

是的,可以在 onDrawFrame() 中重新加载纹理,我在我的 OpenGL 代码中使用此方法重新加载纹理。 以下是我的 onDrawFrame() 代码的摘录:

public void onDrawFrame(GL10 glUnused) {
    if (bReloadWood) {
        unloadTexture(mTableTextureID);
        mTableTextureID = loadETC1Texture("textures/" + mWoodTexture);
        bReloadWood = false;
    } 
    //...
}

方法 unloadTexture()loadETC1Texture() 执行常见的 OpenGL 操作以将纹理卸载和加载到 GPU:

protected void unloadTexture(int id) {
    int[] ids = { id };
    GLES20.glDeleteTextures(1, ids, 0);
} 

protected int loadETC1Texture(String filename) {
    int[] textures = new int[1];
    GLES20.glGenTextures(1, textures, 0);

    int textureID = textures[0];
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);


    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

    InputStream is = null;
            // excluded code for loading InputStream for brevity

    try {
        ETC1Util.loadTexture(GLES10.GL_TEXTURE_2D, 0, 0, GLES10.GL_RGB, GLES10.GL_UNSIGNED_SHORT_5_6_5, is);
    } catch (IOException e) {
        Log.w(TAG, "Could not load texture: " + e);
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            // ignore exception thrown from close.
        }
    }

    return textureID;
} 

关于android - 在 OpenGL ES 2.0 的显示函数中生成纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13929338/

相关文章:

java - LibGDX FreeType 字体模糊

c++ - 为 Qt5 指定 OpenGL 桌面而不是 ES

opengl - OpenGL ES和OpenGL兼容的着色器

linux - SDL2 + openGL ES 2.0 帧速率性能提升,CPU 负载更少

javascript - Android 中的 WebView 文本缩放问题

java - 如果没有可用的互联网连接,我的应用程序会出现 ANR

database - 将照片与应用程序 : files or in sqlite database? bundle 在一起的最佳方式

android - OpenGL ES 中的 GPU 分析和回调

android - GLSurfaceView.RENDERMODE_CONTINUOUSLY 导致闪烁

android - 如何使用 facebook api 在 facebook 帖子中设置图标并添加操作?