设为首页 加入收藏

TOP

利用Android NDK开发OpenGLES如何利用上层Bitmap生成纹理
2014-11-24 11:39:41 来源: 作者: 【 】 浏览:0
Tags:利用 Android NDK 开发 OpenGLES 如何 上层 Bitmap 生成 纹理

下面是我的做法,可供参考,如果有更好的方法,请告知:


我想要在OpenGLES中绘制文字,所以首先我利用Canvas生成想要的Bitmap,然后在android上层生成纹理映射,把纹理映射的绑定地址传递个JNI


public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) {
//从这里开始生成所需Bitmap


String s = "北京";


Bitmap bitmap;


//构建Bitmap,它的widthheight必须是2n次方
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 0
gl10.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);


//到这里纹理映射完成


//把我们的纹理映射地址传递给JNI


Native_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中绑定纹理,但是我现在还没有实现,希望了解此方法的人能给我一些帮助。谢谢。


希望以上文档对你有一些帮助。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇AppsGeyser:快速制作 android ap.. 下一篇Android.mk语法说明(android ndk..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Linux_百度百科 (2025-12-26 12:51:52)
·Shell 流程控制 | 菜 (2025-12-26 12:51:49)
·TCP/UDP协议_百度百科 (2025-12-26 12:20:11)
·什么是TCP和UDP协议 (2025-12-26 12:20:09)
·TCP和UDP详解 (非常 (2025-12-26 12:20:06)