Android JNI利用opengl渲染文字 (一)
Learning opengl 中关于文字渲染的部分,写的非常详细,但是在android jni环境下如何利用opengl的能力,渲染出文字,找了一圈,确实没有特别讲这块的内容,这里涉及到几点比较重要的点,首先如何把surface设置到c++层,其次如何家在freetype库,第三,渲染文字shader在android下如何写。
创建Native C++项目
名字可以随便起,不过语言最好选择Kotilin,跑起来的话
修改activity_main.xml
删除label组建,添加一个surfaceview,代码如下
<SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" />
修改MainActivity.kt获取surface view
glSurfaceView = findViewById<SurfaceView>(R.id.surfaceView)
glSurfaceView.holder.addCallback(object : SurfaceHolder.Callback {override fun surfaceCreated(holder: SurfaceHolder) {nativeSetView(glSurfaceView.holder.surface)}override fun surfaceChanged(surfaceHolder: SurfaceHolder, i: Int, width: Int, height: Int) { }override fun surfaceDestroyed(holder: SurfaceHolder) {}
})
添加native函数nativeSetView
添加以后,android studio会把函数名设置为红色,如果鼠标移上去,ide会提示你是不是要建立对应的c++调用函数,这是最简单的方式。
external fun nativeSetView(surface: Surface)
创建后的函数中获取ANativeWindow
这里需要在文件中建立一个全局变量来保证各个函数能用到这个变量。
g_window = ANativeWindow_fromSurface(env, surface);
渲染一个纯色
继续添加以下代码,glClearColor之前的代码都是套路的代码,都是准备opengl的各个环境。
EGLDisplay mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (mDisplay == EGL_NO_DISPLAY) {printf("egl display failed");
}
if (EGL_TRUE != eglInitialize(mDisplay, 0, 0)) {printf("eglInitialize failed");
}EGLConfig eglConfig;
EGLint configNum;
EGLint configSpec[] = {EGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_SURFACE_TYPE, EGL_WINDOW_BIT,EGL_NONE
};if (EGL_TRUE != eglChooseConfig(mDisplay, configSpec, &eglConfig, 1, &configNum)) {printf("eglChooseConfig failed");
}EGLSurface mWinSurface = eglCreateWindowSurface(mDisplay, eglConfig, mWindow, 0);
if (mWinSurface == EGL_NO_SURFACE) {printf("eglCreateWindowSurface failed");
}const EGLint ctxAttr[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
};
EGLContext context = eglCreateContext(mDisplay, eglConfig, EGL_NO_CONTEXT, ctxAttr);
if (context == EGL_NO_CONTEXT) {printf("eglCreateContext failed");
}
if (EGL_TRUE != eglMakeCurrent(mDisplay, mWinSurface, mWinSurface, context)) {printf("eglMakeCurrent failed");
}//draw call
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
eglSwapBuffers(mDisplay, mWinSurface);
Android JNI利用opengl渲染文字 (一)相关推荐
- Android JNI利用opengl渲染文字 (二)
上篇文章准备了opengl渲染图像的环境.这片文章要做的是把freetype加载到程序中,并可以从路径中加载字体. 编译Android平台上的freetype https://www.cnblogs. ...
- 利用OpenGL渲染并用OpenCV输出显示二维图像
OpenGL所有渲染的结果都输出显示在窗口中,设置OpenCV的图像cv::Mat outimg,并使用OpenGL的glReadPixels从帧缓冲区中加载像素至内存: //use fast 4-b ...
- android 渲染yuv数据,Android opengl渲染yuv420例子
[实例简介] Android下使用OpenGL渲染yuv420p图像并显示.例子中提供了两种类型,一种使用GLSurfaceView在onDrawframe中调用native方法绘制,另外一种使用EG ...
- 教你实现GPUImage【OpenGL渲染原理】
原文出处: 袁峥Seemygo(@袁峥Seemygo) 一.前言 本篇主要讲解GPUImage底层是如何渲染的,GPUImage底层使用的是OPENGL,操控GPU来实现屏幕展示 由于网上Ope ...
- Android native 层使用opengl渲染YUV420p和NV12
<Ndk中使用Mediacode解码> <android mediacodec 编码demo(java)> <NDK中使用mediacodec编码h264> < ...
- Android+JNI+OpenGL开发自己的美图秀秀
https://blog.csdn.net/oshunz/article/details/50537631 Android+JNI+OpenGL开发自己的美图秀秀 2016年01月18日 16:39: ...
- android OpenGL渲染3D模型文件
码字不易,转载请注明出处喔 https://blog.csdn.net/newchenxf/article/details/121402859 1 前言 大部分OpenGL示例代码,要么播放个视频,要 ...
- Android平台上基于OpenGl渲染yuv视频
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 更多音视频开发文章,请看:音视频开发专栏 介绍一个自己刚出炉的音视频播放录制开源项目 前言 这是我音视频专栏的第一篇实例解析,也算是 ...
- opengl es2.0 渲染文字
在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的free ...
最新文章
- IDEA2020如何设置全局maven路径
- python进度条 pyqt_Python高级进阶#015 pyqt5进度条QProgressBar结合使用qbasictimer
- 从羊毛党看一个成功的裂变活动
- 2018-04-12 Linux学习
- poj-3641 Pseudoprime numbers(费马小定理)
- postgreSQL的索引
- [zz]volatile
- redis docker安装、进入命令行后启动服务
- 编程语言那么多,学哪个能拿高薪?
- 顺序查找、折半查找、索引查找
- autojs遍历当前页面所有控件_精心推荐-自动化软件AutoJs(薅羊毛?)
- Linux线程私有数据Thread-specific Data(TSD) 详解
- smartbi mysql_如何修改smartbi自带的mysql的root用户的密码
- matlab 数组中的一个值,MATLAB数组元素引用的三种方法
- 未注册域名批量查询工具
- 计算机博士5篇sci,研究员送5篇SCI论文给女博士 SCI论文到底是啥
- 大数据架构和模式(五):利用大数据识别保险行业中的欺诈业务案例
- 托里拆利小号:有关于其的证明
- Python居然能破解传说中的摩斯密码?“有内鬼,终止交易”
- L298N 驱动电机与单片机的线路连接图