android 下使用Direct Texture
要使用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 -ljnigraphicsandroid Opengles 里虽然没有PBO, 但是用Direct Texture能实现类似的功能。direct textures 的使用介绍http://snorp.net/2011/12/16/android-direct-texture.htmleglCreateImageKHR扩展的介绍http://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_image_base.txt
描述:在opengles 编程时如果用glTexImage2D /glTexSubImage2D API的话,当渲染的图片很大时,速度会变得很慢的,因为运行时会发生数据拷贝的过程,而使用opengles 的扩展glEGLImageTargetTexture2DOES可以解决这个问题,用这个扩展要用到另一个扩展 eglCreateImageKHR 。
android 下使用Direct Texture的更多相关文章
- Android下基于SDL的YUV渲染
实战篇 本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染. 相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitm ...
- android下vulkan与opengles纹理互通
先放demo源码地址:https://github.com/xxxzhou/aoce 06_mediaplayer 效果图: 主要几个点: 用ffmpeg打开rtmp流. 使用vulkan Compu ...
- Android下/data/data/<package_name>/files读写权限
今天将更新模块拿到android上面测试的时候,发现在创建writablepath.."upd/"目录的时候出现Permission Denied提示BTW:我使用的是lfs来创建 ...
- Android下Cocos2d创建HelloWorld工程
最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...
- Android下读取logcat的信息
有时我们需要在程序执行进程中遇到一些异常,需要收集一logcat的信息,android下就可以使用以下方法获取: private static String getLogcatInfo(){ Stri ...
- Android下OpenCV的环境搭建
目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...
- Android下添加新的自定义键值和按键处理流程
Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...
- Android下的数据储存方式(三)
Android下最好的数据储存方式:关系型数据库sqlite. 数据库的创建:使用SqliteOpenHelper类 结合SqliteOpenHelper类和SQLiteDatabase类的帮 ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
随机推荐
- Idea 配置启动JDK___在windows中使用Intellij Idea时选择自定义的64位JVM
略过下面的叙述快速配置 配置你的Idea启动jdk (Idea15之后的版本启动不要JDK1.8) 添加环境变量IDEA_JDK_64,配置和JAVA_HOME环境变量相同,路径写到1.8的jdk就 ...
- Tomcat Post请求大小限制
理论上讲,POST是没有大小限制的.HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力. 如:在Tomcat下取消POST大小的限制(Tomcat默认2M): 打开tomca ...
- Mybatis执行sql(insert、update、delete)返回值问题
数据库:Mysql 在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下. 结论: insert: 插入n条记录,返回影响行数n.(n>=1,n为0时实际为插入失败) up ...
- js的函数作用域跟块级作用域
js的函数作用域跟块级作用域(原文地址:http://blog.csdn.net/huangjq36sysu/article/details/51085674)
- ArcGIS中国工具(ArcGISCTools)2.0在线视频
查看地址:http://i.youku.com/gisoracle 在线看的不太清楚,支持下载视频地址 使用手册下载地址:http://pan.baidu.com/s/1kTsTyXT操作视频下载地址 ...
- C# 程序启动最小化至任务栏及闪烁
主要功能: C#让窗体最小化至任务栏,同时在系统托盘区的图标点击左键能显示窗体,并使窗体闪烁. 首先: 创建窗体应用程序,并添加控件NotifyIcon及ContextMenuStrip控件 Noti ...
- hexo安装-nodejs
npm- 安装淘宝源 http://npm.taobao.org/$ npm install -g cnpm --registry=https://registry.npm.taobao.org- 查 ...
- QA-IDEA中用maven配置项目无法加载JDBC
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver Im building Maven Java Web application and w ...
- Linux文件系统检查错误
我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命 ...
- linux 用户切换 标签: linux 2016-07-30 13:57 144人阅读 评论(0) 收藏
一.指令修改 1.普通用户切换到root用户: su root 需要输入密码 2.root用户切换到普通用户: su 用户名 不需要输入密码 二.直接注销,再用新用户登录 注:1.两种方式存在差别,用 ...