要使用Direct Texture,需要有一份android系统的源码
部分C++代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <android/native_window.h>
#include <ui/GraphicBuffer.h>
#include <dlfcn.h>
#include <jni.h>
#include "render_native.h"
 
int Graphics::initGL(){
 
     const char* const driver_absolute_path = "/system/lib/egl/libEGL_mali.so";
    // On Gingerbread you have to load symbols manually from Mali driver because
    // Android EGL library has a bug.
    // From  ICE CREAM SANDWICH you can freely use the eglGetProcAddress function.
    // You might be able to get away with just eglGetProcAddress (no dlopen). Tr y it,  else revert to the following code
    void* dso = dlopen(driver_absolute_path, RTLD_LAZY);
    if (dso != 0)
    {
        LOGI("dlopen: SUCCEEDED");
        _eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)dlsym(dso, "eglCreateImageKHR");
        _eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) dlsym(dso,"eglDestroyImageKHR");
    }
    else
    {
        LOGI("dlopen: FAILED! Loading functions in common way!");
        _eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress("eglCreateImageKHR");
        _eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) eglGetProcAddress("eglDestroyImageKHR");
    }
 
    if(_eglCreateImageKHR == NULL)
    {
        LOGE("Error: Failed to find eglCreateImageKHR at %s:%in", __FILE__, __LINE__);
        exit(1);
    }
    if(_eglDestroyImageKHR == NULL)
    {
        LOGE("Error: Failed to find eglDestroyImageKHR at %s:%in", __FILE__, __LINE__);
        exit(1);
    }
        _glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) eglGetProcAddress("glEGLImageTargetTexture2DOES");
    if(_glEGLImageTargetTexture2DOES == NULL)
    {
        LOGI("Error: Failed to find glEGLImageTargetTexture2DOES at %s:%in", __FILE__, __LINE__);
        return 0;
    }
     
    graphicBuffer = new GraphicBuffer( emu_width,emu_height,
            HAL_PIXEL_FORMAT_RGBA_8888,
            GraphicBuffer::USAGE_HW_TEXTURE |
            GraphicBuffer::USAGE_HW_2D |
            GRALLOC_USAGE_SW_READ_OFTEN |
            GRALLOC_USAGE_SW_WRITE_OFTEN);
             
    status_t err = graphicBuffer->initCheck();
    if (err != NO_ERROR)
    {
        LOGI("Error: %sn", strerror(-err));
        return 0;
    }
     
    GGLSurface t;
    //   graphicBuffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN, &addr);
    graphicBuffer->lock(&t, GRALLOC_USAGE_SW_WRITE_OFTEN);
           
    memset(t.data,128,t.stride*t.height);
    graphicBuffer->unlock();
     
     
    // Retrieve andorid native buffer
    android_native_buffer_t* anb =graphicBuffer->getNativeBuffer();
    // create the new EGLImageKHR
    const EGLint attrs[] =
    {
        EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
        EGL_NONE, EGL_NONE
    };
     
    mEngine.mTexture.pEGLImage = _eglCreateImageKHR(eglGetCurrentDisplay(),
                                mEngine.nContext, EGL_NATIVE_BUFFER_ANDROID, (EGLClientBuffer)anb, attrs);
    if(mEngine.mTexture.pEGLImage == EGL_NO_IMAGE_KHR)
    {
        LOGI("Error: eglCreateImage() failed at %s:%in", __FILE__, __LINE__);
        return 0;
    }
    checkGlError("eglCreateImageKHR");
    LOGI("create Program.......");
    GLuint gProgram = createProgram(vertex_source, fragment_source);
     checkGlError("createProgram");
     if (!gProgram) {
             LOGE("Could not create program.");
             return false;
          }
     glUseProgram(gProgram);
     vPosition = glGetAttribLocation(gProgram, "glVertex");
         checkGlError("glGetAttribLocation glVertex");
     glEnableVertexAttribArray(vPosition);
 
    a_texCoord0 = glGetAttribLocation(gProgram, "a_texCoord0");
        checkGlError("glGetAttribLocation texCoord0");
     glEnableVertexAttribArray(a_texCoord0);
 
     s_tex0 = glGetUniformLocation(gProgram, "s_texture0");
        checkGlError("glGetAttribLocation texture");
         
     
     
        LOGI("glGen Textures.......");
    glGenTextures(1, &texID);
     
    glDisable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_STENCIL_TEST);
    glDisable(GL_DITHER);
    checkGlError("glDisable");
//  glEnable(GL_TEXTURE_2D);
//  checkGlError("glEnable(GL_TEXTURE_2D)");
    glGenTextures(1,&texID);
    checkGlError("glGenTextures");
     glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texID);
//  glPixelStorei(GL_PACK_ALIGNMENT, 1);
//      glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST  );
         
//       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mEngine.mTexture.nTextureWidth, mEngine.mTexture.nTextureHeight, 0,GL_RGBA, GL_UNSIGNED_BYTE, NULL);
     
//  glFinish();
    _glEGLImageTargetTexture2DOES(GL_TEXTURE_2D,mEngine.mTexture.pEGLImage);
         
     float w = float(emu_width)  / float(mEngine.mTexture.nTextureWidth);
     float h = float(emu_height) / float(mEngine.mTexture.nTextureHeight);
 
         g_pos=initFloatBuffer(vertices,12);
        g_texvbo=initFloatBuffer(texCoords,8);
         
        glViewport(0, 0,  mEngine.nScreen_Width, mEngine.nScreen_Height);
        return 1;
 
}
 
void Graphics::renderFrame() {
 
//  texture=(unsigned char*)ture;
    glClearColor(0.5f, 0.5f, 0.5f, 1);
    glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
 
     glUniform1i(s_tex0, 0);
     glBindBuffer(GL_ARRAY_BUFFER, g_pos);
     glVertexAttribPointer(vPosition, 3, GL_FLOAT, GL_FALSE, 0, 0);
     glBindBuffer(GL_ARRAY_BUFFER, g_texvbo);
     glVertexAttribPointer(a_texCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     
  eglSwapBuffers(mEngine.nDisplay, mEngine.nSurface);
  }
 
void* Graphics::begin(){
    GGLSurface t;
     graphicBuffer->lock(&t,GRALLOC_USAGE_SW_WRITE_OFTEN);
    return t.data;
}
void Graphics::end(){
     graphicBuffer->unlock();
     renderFrame();
}
 
 
使用时如下:
Graphics  render;
 
 
void *buffer=render.begin();
把数据填充到buffer里
render.end();
 
编译时包含头文件
LOCAL_C_INCLUDES +=
    $(ANDROID_SRC_HOME)/frameworks/base/core/jni/android/graphics 
    $(ANDROID_SRC_HOME)/frameworks/base/include/
    $(ANDROID_SRC_HOME)/hardware/libhardware/include
    $(ANDROID_SRC_HOME)/system/core/include
    $(ANDROID_SRC_HOME)/frameworks/base/native/include/
    $(ANDROID_SRC_HOME)/frameworks/base/opengl/include/
 
链接选项:
LOCAL_LDLIBS    := -llog -lGLESv2 -lEGL -landroid  -lui -landroid_runtime  -ljnigraphics
 
android  Opengles 里虽然没有PBO, 但是用Direct Texture能实现类似的功能。
 
direct textures 的使用介绍
http://snorp.net/2011/12/16/android-direct-texture.html
 
eglCreateImageKHR扩展的介绍
http://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_image_base.txt

描述:在opengles 编程时如果用glTexImage2D /glTexSubImage2D API的话,当渲染的图片很大时,速度会变得很慢的,因为运行时会发生数据拷贝的过程,而使用opengles 的扩展glEGLImageTargetTexture2DOES可以解决这个问题,用这个扩展要用到另一个扩展 eglCreateImageKHR 。

android 下使用Direct Texture的更多相关文章

  1. Android下基于SDL的YUV渲染

    实战篇 本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染. 相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitm ...

  2. android下vulkan与opengles纹理互通

    先放demo源码地址:https://github.com/xxxzhou/aoce 06_mediaplayer 效果图: 主要几个点: 用ffmpeg打开rtmp流. 使用vulkan Compu ...

  3. Android下/data/data/<package_name>/files读写权限

    今天将更新模块拿到android上面测试的时候,发现在创建writablepath.."upd/"目录的时候出现Permission Denied提示BTW:我使用的是lfs来创建 ...

  4. Android下Cocos2d创建HelloWorld工程

    最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...

  5. Android下读取logcat的信息

    有时我们需要在程序执行进程中遇到一些异常,需要收集一logcat的信息,android下就可以使用以下方法获取: private static String getLogcatInfo(){ Stri ...

  6. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  7. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  8. Android下的数据储存方式(三)

      Android下最好的数据储存方式:关系型数据库sqlite.   数据库的创建:使用SqliteOpenHelper类 结合SqliteOpenHelper类和SQLiteDatabase类的帮 ...

  9. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

随机推荐

  1. CentOS 6 安装 MySQL 8.0.+

    1.先查询是否安装MySQL 大多数centos 6 自带 MySQL5.1 命令: rpm -qa|grep mysql 执行: [root@lifan ~]# rpm -qa|grep mysql ...

  2. Jvm运行时内存解析

    一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...

  3. spring和jdbc结合的一个小例子

    1.新建一个SpringJdbc的maven项目. 2.引入需要的jar包的依赖 <span style="white-space:pre"> </span> ...

  4. SASS和LESS等优缺点对比,使用方法总结 (笔记大全)

    sass优点: 用户多,更容易找到会用scss的开发,更容易找到scss的学习资源: 可编程能力比较强,支持函数,列表,对象,判断,循环等: 相比less有更多的功能: Bootstrap/Found ...

  5. 如何编译 opencv3 和 opencv_contrib(Linux)

    本文以编译并安装OpenCV 3.3.0 为例,安装系统为 Linux x64 (Fedora 21),具体步骤如下: 1. 下载 Source code zip 压缩包 从下面网址,选择 openc ...

  6. Linux 内核超时导致虚拟机无法正常启动

    问题描述 当 Linux 虚拟机启动时,通过串口输出或者启动日志, 观察到超时的报错.导致虚拟机无法正常启动和连接. 问题分析 常见的超时报错范例如下: 复制 INFO: task swapper:1 ...

  7. Linux文件系统的实现 ZZ

    作者:Vamei 出处:http://www.cnblogs.com/vamei Linux文件管理从用户的层面介绍了Linux管理文件的方式.Linux有一个树状结构来组织文件.树的顶端为根目录(/ ...

  8. Timeout occurred while waiting for latch: class 'COLUMNSTORE_ROWGROUP_COLLECTION'

    今天发现线上数据库主从延迟严重: SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.da ...

  9. centos7和centos6区别

    CentOS 7 vs CentOS 6的不同   (1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME Shell) (2)文件系统[CentOS6 ...

  10. c# 知识学习

    1.C#基础知识梳理系列 2.详解C#委托,事件与回调函数 3.C#制作Windows service