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 -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的更多相关文章
- 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= ...
随机推荐
- Collatz 序列、逗号代码、字符图网格
1.collatz序列 编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数, 那么 collatz()就打印出 number // 2,并返回该值.如果 num ...
- VBA将指定Excel表数据批量生成到另一个Excel表中,每个sheet表一行数据
Sub AutoInputValNewExcel() Dim sh1, sh2 As Worksheet Dim ws1, ws2 As Workbook ) ) ).Sheets() iRows = ...
- java设计模式之工厂模式学习
上周安排的写两篇设计模式的文章,结果一篇也没写,今天都给写了.回顾+反思.In this world he who stops ,won't get anything he wants! 工厂方法模式 ...
- jquery 拓展函数集
方式: 通过拓展在调用$()时返回的包装器 1.将函数绑定到$.fn $.fn.disable = function(){ return this.each(function(){ if (typeo ...
- 为什么canvas宽高要设置在标签内>>宽高设置在style和设置在canvas的区别
一直很困惑为什么canvas标签和其他标签不一样,宽高需要设置在canvas标签里,设置在style里就会有问题. 纯粹个人理解,有错误欢迎指出. > 结论写在头 设置在style里有问题其实是 ...
- SharePoint 2013 - REST API about Security
1. 获取当前用户信息(current user): var currentUserInfo = "{0}/_api/Web/CurrentUser"; // {0} -> ...
- JavaScript中模块化工具require.js
什么是require.js? RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.它还同时可以和其他的框架协同工作,使用RequireJS必将使您的前端代 ...
- PHP 多图片上传实例demo
upload.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- 64位Navicat Premium-11.2.7(64bit)访问64位Oracle服务器
1 在windows 10 64位操作系统安装Navicat Premium-11.2.7(64bit). 2 在服务器安装64位的Oracle(win64_11gR2_database). 3 在h ...
- Oracle案例05——ORA-12162: TNS:net service name is incorrectly specified
最近在梳理环境,发现环境真的不是一般的复杂,配置不是一般的乱,刚在梳理环境的时候发现一个库通过conn /as sysdba无法连接,具体处理过程如下: 一.错误信息 [oracle@ ~]$ sql ...