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 charconst 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

时间: 2024-08-10 21:28:55

android 下使用Direct Texture的相关文章

Android下WiFiDisplay功能探究

1 WiFiDisplay简介 1.1WiFiDisplay概述 WiFiDisplay(WFD)是WiFi联盟在已有技术的基础上,为了加速视/音频的传输分享而提出来的一个新概念.WiFi联盟对此成立了一个认证项目:Miracast-- 用来认证一个设备是否支持WiFiDisplay功能. 下图是WiFiDisplay功能的技术支撑体系,实际上最重要的部分就是WiFi Direct:也就是两个设备无需AP(AccessPoint)的情况下直接相连,这就奠定了两个带WiFi功能的设备能够随时传递高

Android下将图片载入到内存中

Android的系统的标准默认每一个应用程序分配的内存是16M.所以来说是很宝贵的,在创建应用的时候要尽可能的去节省内存,可是在载入一些大的文件的时候,比方图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当载入到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,以下我就来带大家创建一个用来图片缩放的应用: 应用效果图例如以下: 核心代码的实现: package com.examp.loa

fiddler Android下https抓包全攻略

fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP是抓不到包的,需要一些特殊的配置,本文把fiddler Android下https抓包的详细配置都罗列出来,供大家参考. 一.普通https抓包设置 先对Fiddler进行设置: 勾选“CaptureHTTPS CONNECTs”,接着勾选“Decrypt HTTPS traffic”.同时,由于我

Android下pm 命令详解

Sam在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之.0. Usage: usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list permissions [-g] [-f] [-d] [-u] [GROUP] pm list ins

android下的单元测试

android下的单元测试 在AndroidManifest.xml文件中配置以下信息: 在manifest节点下添加: <!-- 指定测试信息和要测试的包 --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.jxn.junittest" /> 在application节点下添加: <!

cocos搭建android下的开发环境

没想到cocos3.2也出现了一点bug,还要经过一周晚上的努力,全部搞定.可以在android下使用啦 上个截图庆祝下 有需要的可以看http://item.taobao.com/item.htm?id=40745006457 cocos搭建android下的开发环境,布布扣,bubuko.com

Android下EditText的hint的一种显示效果------FloatLabelLayout

效果: 此为EditText的一种细节,平时可能用的不多,但是用户体验蛮好的,特别是当注册页面的项目很多的时候,加上这种效果,体验更好 仅以此记录,仅供学习参考. 参考地址:https://gist.github.com/chrisbanes/11247418 采用的是Android 3.0的动画,所以有版本限制,可以用  nineoldandroids  做向下兼容 ,当然上面的网址也给了另一种方式做向下兼容. demo地址:http://download.csdn.net/detail/ab

Android下的动画

        ------你需要努力,你还没资格休息----- Android下的动画有三种: tween补间动画.frame帧动画.property属性动画(Android3.0后提出来的). 补间动画: Translation(平移).Rotation(旋转).Alpha(透明).Scale(缩放) 代码方式:透明动画AlphaAnimation alpha=new AlphaAnimation(0,1); alpha.setDuration(2000);//执行的时间 alpha.set

Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉加载,而是针对下拉刷新上拉加载常用的一些应用场景就行了一些总结,包含了下拉刷新上拉加载过程中遇到的一些手势冲突问题的解决方法(只能算是抛砖引玉). 去年9月的时候,那时自己正在独立做Android项目.记得刚刚写完那个ListView列表页面(木有下拉刷新,上拉加载)