利用android_ndk开发OpenGLES如何利用上层Bitmap生成纹理
来源:互联网 发布:网络本科 编辑:程序博客网 时间:2024/05/22 13:52
在网上找了很多的资料,想利用android上层生成Bitmap,然后把Bitmap的pixel传递给JNI,然后再C++中生成纹理映射,但是结果都失败了。最后自己想得到了一个方法,在android上层直接生成纹理映射,然后把纹理映射的地址传递给JNI,这样就可以利用上层的Bitmap生成纹理映射了。当然这不是最好的方法,但是由于自己现在的能力有限,暂时只能依靠这个方法了,如果有人知道如何正确的利用Bitmap在C++中生成纹理映射,欢迎和我交流。(我利用Bitmap在C++中生成了纹理映射,但是纹理是乱纹,而不是正确的纹理,应该是我生成的Bitmap的pixel数组有问题。)
下面是我的做法,可供参考,如果有更好的方法,请告知:
我想要在OpenGLES中绘制文字,所以首先我利用Canvas生成想要的Bitmap,然后在android上层生成纹理映射,把纹理映射的绑定地址传递个JNI:
//定义一个int数组用来保存纹理private int[] TextureString = new int[1];public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) {// 从这里开始生成所需BitmapString s = "北京";Bitmap bitmap;// 构建Bitmap,它的width和height必须是2的n次方bitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);// 设置画布背景为透明,这样我们的纹理就只显示文字,而没有颜色背景canvas.drawColor(Color.TRANSPARENT);Paint p = new Paint();// 设置字体、字体大小和字体颜色String familyName = "宋体";Typeface font = Typeface.create(familyName, Typeface.BOLD);p.setColor(Color.RED);p.setTypeface(font);p.setTextSize(50);// 在Bitmap上绘制文字canvas.drawText(s, 300, 60, p);s = "阴,23摄氏度";canvas.drawText(s, 0, 120, p);s = "高温:26,低温: 18 ";canvas.drawText(s, 0, 240, p);// 到这里为止,所需Bitmap构建完成// 从这里开始生成纹理映射gl10.glGenTextures(1, TextureString, 0);// Create Nearest Filtered Texture and bind it to texture 0gl10.glBindTexture(GL10.GL_TEXTURE_2D, TextureString[0]);gl10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);gl10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST);GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);// 到这里纹理映射完成// 把我们的纹理映射地址传递给JNINative_SolarWind.DrawText(TextureString);// 初始化OpenglES场景设置Native_SolarWind.onSurfaceCreated(gl10, eglconfig, 0, 0);}
到这里为止,上层绑定纹理映射的工作完成。下面是在JNI中调用上层的纹理:
JNI生成的头文件:
/* * Class: com_ygc_Native_Method * Method: DrawText * Signature: ([B)V */JNIEXPORT void JNICALL Java_com_ygc_Native_Method_DrawText (JNIEnv *, jclass, jintArray);
对应的.cpp文件
JNIEXPORT void JNICALL Java_com_ygc_Native_Method_DrawText(JNIEnv *env , jclass cls, jintArray texture){ TextureString = (GLuint *)env->GetIntArrayElements(texture,0);}
其中TextureString变量为一个整型指针变量:extern GLuint *TextureString;用来绑定纹理映射。我们把android上层绑定纹理的整型变量的地址传递给TextureString,这样我们在cpp文件中,就可以利用这个地址来使用上层绑定的纹理了,类似于:glBindTexture(GL_TEXTURE_2D, *TextureString);
由于不能把全部代码贴上来,可能有些人看不太明白,对此我表示抱歉。如果有人需要使用这种方法,有不甚理解,可以回复我,我会详细解答你的疑惑。利用这种方法还有一个问题,就是在第一次渲染的时候,上层的纹理不可使用,必须旋转屏幕,重新加载,才可以正常显示,具体原因还在调查。
当然最好的方法还是在cpp中绑定纹理,但是我现在还没有实现,希望了解此方法的人能给我一些帮助。谢谢。
希望以上文档对你有一些帮助。
- 利用android_ndk开发OpenGLES如何利用上层Bitmap生成纹理
- 利用android_ndk以及OpenGLES开发动态壁纸
- 利用android_ndk以及OpenGLES开发动态壁纸
- 利用android_ndk以及OpenGLES开发动态壁纸
- OpenGLES - glGenTextures 生成命名纹理
- opengles 2.0如何绘制纹理
- android开发LiveWallpaper流程(利用OpenGLES开发)
- iOS 利用OpenGLES画一个带多重纹理的旋转的立方体
- android利用OpenGLES开发动态壁纸用到的GLWallpaperService类
- Android 如何利用proc有上层想kernel写文件
- Android 如何利用proc有上层想kernel写文件
- 如何给图标加背景(利用bitmap)
- android OpenGLES开发 第五课 纹理映射
- 40.利用bitmap上下文生成图片 生成水印
- 如何利用CPU生成随机数
- 41.利用bitmap生成圆形图片 平铺背景 touch事件
- Unity手机开发之巧妙利用纹理制作滚动背景
- Android_NDK简便开发流程
- JSP图片验证码
- Windows 7硬盘安装工具 NT6 HDD Installer v3.0(含图文教程)
- java练手题之三类继承与多态
- 用汇编的眼光看C++(之判断流程)
- 在Arcgis Engine中使用Arcgis Server的切片地图的一点心得
- 利用android_ndk开发OpenGLES如何利用上层Bitmap生成纹理
- C&&C++中函数指针用法示例
- 讲述VB.NET实现拖动图片
- Linux操作系统运行模式Runlevel技术解析
- BMP文件格式
- Git push 出错以及server端没有显示push后的文件的解决方法
- 苹果电视棒IPAD TV
- HDU--3487[Play with Chain] Splay_Tree
- U-BOOT 引导内核