问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

利用Android NDK开发OpenGLES如何利用上层Bitmap生成纹理

发布网友 发布时间:2022-10-23 12:00

我来回答

1个回答

热心网友 时间:2024-12-04 21:51

最后自己想得到了一个方法,在android上层直接生成纹理映射,然后把纹理映射的地址传递给JNI,这样就可以利用上层的Bitmap生成纹理映*。当然这不是最好的方法,但是由于自己现在的能力有限,暂时只能依靠这个方法了,如果有人知道如何正确的利用Bitmap在C++中生成纹理映射,欢迎和我交流。(我利用Bitmap在C++中生成了纹理映射,但是纹理是乱纹,而不是正确的纹理,应该是我生成的Bitmap的pixel数组有问题。)下面是我的做法,可供参考,如果有更好的方法,请告知:我想要在OpenGLES中绘制文字,所以首先我利用Canvas生成想要的Bitmap,然后在android上层生成纹理映射,把纹理映射的绑定地址传递个JNI:public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) {//从这里开始生成所需Bitmap String 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); //到这里纹理映射完成 //把我们的纹理映射地址传递给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中绑定纹理,但是我现在还没有实现,希望了解此方法的人能给我一些帮助。谢谢。希望以上文档对你有一些帮助。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...的电器到成都,请问一下,那个航空快一些呀,多少/公斤? 前女友和我分手一年之后,出车祸死了,我很高兴,这种心理是不是不... 为什么听到前女友去世的消息,我竟然放声大哭,她很爱我,是我对她腻了... 兰州银行充天然气必须要本行卡吗 从服饰礼仪看中西方文化差异 为什么iqoo11评价那么低? 相机快门线的运用范围 快门线是干什么用的 请问这是什么虫子 还挺硬的 在楼房内 整理箱上面发现的 屋内有木质上... 请问这是什么虫子?家里抓到,2cm左右。坐标北京,昌平,冬季12月,楼房... 韶关宝能城市发展有限公司怎么样? 做糕点需要哪些食材 做蛋糕的食材需要什么 做纸杯蛋糕需要哪些食材和步骤 做纸杯蛋糕需要什么食材和步骤_百度知 ... 想做蛋糕需要准备什么? 身份证鉴别仪和阅读器有什么不同吗? 百骨夜宴女主和谁在一起了 2019重疾险年交 病毒是怎么形成的 奠定造句-用奠定造句 华为mate20系列怎么选择 华为mate20 。mate20x。 mate20pro。3款哪个好?选择哪款好一些_百度知... 有谁知道这个字体是华为mate20上的哪个字体? 冲饮的柠檬粉是什么酸性还是碱性 夏季宝宝需要的消暑食品 汤臣倍健维生素e和燕麦片一起冲吃好吗 有益五脏六腑的冲饮食品,或者成品食物 昨天刚买的苹果7P.电话服务支持就20天。求大神们帮我看看我是不是买到... 《西游记》中父亲的角色 一直有一个问题想不明白,如来的父母是谁? 如来他爸爸是谁? 斯巴鲁森林人与JEEP自由光哪款车更适合家庭用 Jeep新自由光怎么样 今天UC闪屏图片是“相离莫相忘 且行且珍惜”,这个壁纸的出处是什么... 快速公交专用车道的设计应符合哪些规定? 公交专用车道的相关标准 比谷爱凌妈妈还厉害的中国爸爸,400封家书透露了育儿的3大真相 你觉得什么是“家庭教育”?该怎样进行“家庭教育”呢? 家庭教育的“三大定律” 旧车常见故障的维修方法 关于“眺望”的诗句有哪些? 洗碗时碗突然裂了是什么预兆呢? 为什么叫龚俊爸爸 夫妻教育孩子有分歧 怎样消灭花卉上的甲壳虫? 高血压常与肾病“狼狈为奸”,怎样预防高血压肾病最高效? 大闸蟹可以冰箱冷冻几天吗? 漂白粉可以把染发膏飘回来吗 零五网五年级数学补充习题上册61页答案 家庭教育要掌握的18个分寸 家庭教育中需注意的18个分寸