android_ndk开发OpenGLES如何利用上层Bitmap生成纹理的问题

堕落的天使 堕落的天使 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在网上找了很多的资料,想利用android上层生成Bitmap,然后把Bitmap的pixel传递给JNI,然后再C++中生成纹理映射,但是结果都失败了。最后自己想得到了一个方法,在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 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中绑定纹理,但是我现在还没有实现,希望了解此方法的人能给我一些帮助。



我现在想要的是可否直接把bitmap对象传递个JNI,然后在JNI中对bitmap进行处理,得到用于纹理映射的byte数组,或者在java代码中对bitmap进行处理,得到用于纹理映射的byte数组,然后把byte数组传递给JNI,用来生成纹理。


我至今还没有找到解决的办法,而有没有OpenGLES中native private static int native_texImage2D(int target, int level, int internalformat,
Bitmap bitmap, int type, int border);的源码,还请知道的大侠指点迷津。
...全文

相关推荐

Android NDK开发:通过上层Bitmap生成纹理的OpenGLES实现

在Java层中,我们需要编写一个Native方法,用于将Bitmap对象传递给C/C++代码。在Android NDK开发中,我们可以利用上层的Bitmap对象生成纹理,以供OpenGLES渲染使用。这样,我们就能够在C/C++代码中利用上层的Bitmap生成纹理,并进行OpenGLES渲染。在C/C++代码中,我们需要编写JNI接口函数来接收Bitmap对象,并将其转换为OpenGLES可用的纹理。在锁定像素数据后,我们可以将其转换为纹理数据,并利用OpenGLES进行渲染操作。函数释放像素数据的锁定。

SVIPCODE

OpenGL ES 文字渲染方式有几种?

在音视频或 OpenGL 开发中,文字渲染是一个高频使用的功能,比如制作一些酷炫的字幕、为视频添加水印、设置特殊字体等等。实际上 OpenGL 并没有定义渲染文字的方式,所以我们最能想到的办法是:将带有文字的图像上传到纹理,然后进行纹理贴图。本文分别介绍下在应用层和 C++ 层常用的文字渲染方式。

字节流动

技术转移机构如何基于数据提升项目撮合精准度?.docx

技术转移机构如何基于数据提升项目撮合精准度?

BIZKEEN

超扭滑模与快速终端滑模的永磁同步电机无感控制:理论、离散化实现与仿真研究(Simulink仿真实现)

内容概要:本文系统研究了超扭滑模控制(STSMC)与快速终端滑模控制(FTSMC)在永磁同步电机(PMSM)无感控制中的应用,重点涵盖其理论基础、离散化实现方法及Simulink仿真验证。文章深入阐述了两种高阶滑模控制策略的设计原理,利用磁链无感观测技术实现转子位置与速度的精确估计,从而省去物理传感器,有效提升了系统的可靠性与鲁棒性。同时,提供了完整的Simulink仿真模型构建方案,包括控制器设计、关键参数整定及动态响应性能分析,充分验证了所提出的方法在零速与低速工况下的卓越控制性能和有效性。; 适合人群:具备电机控制、现代控制理论基础知识及熟练掌握MATLAB/Simulink仿真技能的研究生、科研人员与工程技术人员。; 使用场景及目标:①深入理解高阶滑模控制在电机驱动系统中的设计思想与具体实现;②掌握基于滑模观测器的无感控制核心技术;③开展永磁同步电机高性能控制算法的理论研究、仿真验证与工程化探索。; 阅读建议:建议将文中详尽的理论推导与Simulink仿真模型相结合进行学习,重点关注滑模面的构建、抖振抑制策略的实施以及离散化处理的细节,有条件的研究者可进一步将算法移植到DSP等硬件平台进行实验验证,以深化对理论的理解并检验其实际应用效果。

长安程序猿

多源动态最优潮流的分布鲁棒优化方法(IEEE118节点)(Matlab代码实现)

内容概要:本文系统阐述了基于Matlab的多源动态最优潮流分布鲁棒优化方法,聚焦于IEEE118节点电力系统,旨在应对高比例可再生能源接入背景下源荷双重不确定性所带来的调度挑战。该方法深度融合分布鲁棒优化理论,通过构建能够抵御最坏情况概率分布的决策模型,有效提升了电力系统在复杂不确定性环境下的运行安全性、经济性与可靠性。研究不仅提供了完整的Matlab代码实现,便于结果复现与算法验证,还特别关注了含风电等新能源的现代电网低碳调度问题,为解决实际工程中的优化调度难题提供了强有力的理论支撑和技术工具。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、科研人员及从事智能电网优化运行、能源系统规划等相关领域的工程技术人员。; 使用场景及目标:①研究含高比例可再生能源接入的电力系统动态最优潮流问题;②掌握分布鲁棒优化在电力系统经济调度、低碳调度中的建模思想与求解方法;③利用IEEE118标准测试系统进行算法有效性验证与性能对比分析;④基于所提供的Matlab代码进行二次开发,探索新型不确定性优化理论在电力系统中的创新应用。; 阅读建议:建议读者结合电力系统最优潮流、不确定性优化理论(特别是分布鲁棒优化)的背景知识进行学习,重点关注模型的构建逻辑、目标函数与约束条件的设计原理,以及Matlab代码的具体实现细节。在学习过程中,应动手调试代码,尝试修改系统参数(如新能源出力波动范围、负荷水平等),以观察不同场景下优化结果的变化,从而深刻理解该方法的适应性、优势及其潜在的局限性。

天天程序猿
评论 1
收藏 已收藏
分享
返回顶部
堕落的天使
Android 80,490 成员 91,375 内容