导航:首页 > 操作系统 > androidopengles纹理

androidopengles纹理

发布时间:2025-01-22 00:50:44

‘壹’ android OpenGLES2.0(十六)——3D模型贴图及光照处理(obj+mtl)

在Android OpenGLES2.0(十四)——Obj格式3D模型加载中实现了Obj格式的3D模型的加载,加载的是一个没有贴图,没有光照处理的帽子,为了呈现出立体效果,“手动”加了光照,拥有贴图的纹理及光照又该怎么加载呢?

本篇博客例子中加载的是一个卡通形象皮卡丘,资源是在网上随便找的一个。加载出来如图所示:

obj内容格式如下:

mtl文件内容格式如下:

关于Obj的内容格式,在上篇博客中已经做了总结,本篇博客中使用的obj,可以看到f后面的不再跟的是4个数字,而是 f 2/58/58 3/59/59 17/60/60 这种样子的三组数,每一组都表示为顶点坐标索引/贴图坐标点索引/顶点法线索引,三个顶点组成一个三角形。而头部的 mtllib pikachu.mtl 则指明使用的材质库。
而mtl格式文件中,主要数据类型为:

模型加载和之前的模型加载大同小异,不同的是,这次我们需要将模型的贴图坐标、顶点法线也一起加载,并传入到shader中。其他参数,有的自然也要取到。
模型加载以obj文件为入口,解析obj文件,从中获取到mtl文件相对路径,然后解析mtl文件。将材质库拆分为诸多的单一材质。obj对象的 加载,根据具使用材质不同来分解为多个3D模型。具体加载过程如下:

顶点着色器

片元着色器

完成了以上准备工作,就可以调用 readMultiObj 方法,将obj文件读成一个或多个带有各项参数的3D模型类,然后将每一个3D模型的参数传入shader中,进而进行渲染:

‘贰’ android 用png图像做opengl纹理时出现黑边怎么解决

诶呀,你这种用法大错特错了呀!texImage2D不能乱用呀,他是把资源导入GL用的,有点像玩游戏时的Loading.你应该在你的程序初始化时先glGentexture生成多个纹理句柄然后BindTexture,再把你需要的图片依次输入这时GL已经拥有了你全部的图片资源,然后在绘制的时候,用到哪张纹理就先Bind这个纹理,然后DrawArray,再Bind再DrawArray/DrawElement..哪有你这样每次draw都要texImage2D的?这不要慢死了推荐你去powervr的网站下载Opengles的pc端SDK,里面好多demo

‘叁’ Android OpenGLES 实时美颜(磨皮)的优化(二)

在前一篇文章 Android OpenGLES 实时美颜(磨皮)的优化 ,我们已经介绍了关于实时美颜(磨皮)的一些优化点。但在实际的优化测试中发现,当处理器发热之后,就无法保证预览帧率了,主要还是高斯模糊处理的数据量比较大导致。因此,我们需要寻找新的磨皮余铅方法竖早好。
目前市面上关于磨皮方法有好多种,使用PS磨皮经常用到的方法包括高反差保留、高低频、中性灰以及双线性等。其中中性灰和双线性的效率一般,因此,我们从高反差保留、高低频这两种方法中选择。这里选择使用高反差保留法做磨皮处理,PS中的高反差保留法进行磨皮,随手一搜便能找到很多文章,比如:
https://jingyan..com/article/455a99504d568fa1662778d6.html

接下来,我们尝试着实现文章中讲到的过程。

关于高斯模糊的优化,可以参考本人的文章:
OpenGLES滤镜开发汇总 —— 高斯模糊实现以及优化

对于人像进行高斯模糊,我们设计一个11x11的高斯算子对图像进行高斯模糊,shader如下:
vertex shader :

fragment shader:

经过以上的shader进行高斯模糊处理之后,我们得到这样一张高斯模糊图像:

在PS的高反差保留磨皮方睁并法中,高反差保留磨皮混合采用的是强光模式,计算公式为:color = 2 * color1 * color2。因此,我们设计出这样一个高通滤波器,其shader如下:
fragment shader:

经过高通滤波器之后,我们得到这样一个纹理图像:

可以看到,经过三通道强光混合处理后,痘印、边沿等地方都清晰起来了。强光的程度,一般是3的倍数,这里取24倍。

到这一步,其实我们已经得到了需要过滤颜色值,但在这一张图中,也把边沿的颜色差值包含进来了。我们接下来需要过滤掉边沿的颜色差值。这样在后续的处理中,我们可以保留边沿的细节不被模糊掉。因此接下来,我们需要将经过高通滤波得到的纹理,再做一次高斯模糊。不过这一次不能11 x11 这么大的高斯算子,我们选择一个 5 x 5 大小的高斯算子。高斯模糊的shader 如下:
vertex shader:

fragment shader:

将高通滤波器得到的纹理,经过高斯模糊处理后,得到这样一张纹理:

对比高通滤波器处理后的纹理,边沿细节变得模糊了,而且,需要过滤的颜色差值仍旧保留着。到这一步,我们就得到了做磨皮处理的前置纹理。接下来就是高反差保留磨皮的最后也是最重要的一步。

经过前面的处理,我们得到一张输入图片的高斯模糊纹理,以及一张高反差保留的高斯模糊纹理。我们使用这两张纹理,通过比较蓝色通道,计算出需要磨皮的实际强度值,与原图进行混合处理,然后输出最终的纹理。shader如下所示:

经过上面的处理之后,我们就得到磨皮处理的结果如下:

可以看到,经过高反差保留磨皮后的结果,磨皮效果还不错,而且720P磨皮处理时,在高通骁龙625处理器上,经过高反差保留磨皮之后,预览帧率能够保持在30FPS左右。我们可以看到,边沿细节还是不够明显,所以,我们可以使用USM锐化增强边沿细节部分。这篇文章就不讲解USM锐化的实现了。

详细实现过程,可以参考本人的开源相机项目:
CainCamera
CainCamera的FilterLibrary中有经过优化后的实时美颜(磨皮)实现。

阅读全文

与androidopengles纹理相关的资料

热点内容
华为如何打开语音服务器 浏览:240
python中的idle 浏览:998
五轴联动数控编程 浏览:963
换一台电脑如何远程云服务器 浏览:130
阿里云怎么买云服务器 浏览:662
java提取文字 浏览:95
阿里云服务器同人账号问题 浏览:418
5分钟解压轴题 浏览:339
安卓桌面二级文件夹 浏览:186
eps文档加密 浏览:261
手机怎么做pdf 浏览:162
ug曲面pdf 浏览:279
液化气还是压缩气 浏览:950
阿里云公共ntp服务器地址 浏览:991
金字塔学习机编程 浏览:684
多边形扫描线算法Python 浏览:718
快手app快手粉条在哪里 浏览:256
mysql备份数据库命令linux 浏览:544
车辆解压手续怎么样 浏览:432
怎么提安卓版本号 浏览:622