关于jpct-ae结合相机预览,半透明出错
2013-04-01 16:55
323 查看
使用jpct-ae引擎进行3D开发,需要结合摄像头预览。
布局为
<FrameLayout>
<SurfaceView />
<GLSurfaceView />
</FrameLayout>
其中,SurfaceView是用于照相预览的,GLSurfaceView用于jpct-ae的3D绘图。
为了让相机预览显示出来,我将GLSurfaceView的背景设置为透明
mGLView.setZOrderOnTop(true);
mGLView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mGLView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
在完成上面设置后,相机预览在GLSurfaceView后正常显示出来。
然后用jpct-ae进行绘图时,发现了这么一个问题:
在GLSurfaceView中先画一个不透明的图,然后再画一个半透明的图,
混色出来的结果中缺会出现摄像头的图像,
也就是,不透明的图没有把相机预览的图像挡住。
百思不得其解,是否是引擎本身的算法没有考虑到这个问题?
现象如图:
这个问题初看到让我觉得莫名其妙,混色的结果完全就不符合常理,于是乎,网上各种查,jpct官网(http://www.jpct.net/jpct-ae/)论坛各种找,都没能找到问题所在,于是乎,反编译jpct-ae.jar引擎库,直接查看源码。
目前遇到的有三个类有相似现象,解决方法分别如下:
1.
Object3D.setTransparencyMode(TRANSPARENCY_MODE_ADD);
2.
Overlay.setTransparencyMode(TRANSPARENCY_MODE_ADD);
3.
FrameBuff.blit(tex, 0, 0, 0, 0, 128, 128, 128, 128, 10,true,null);// additive 设为true
查看GLRenderer 源码:
这是几个方法改变的值,最后的应用
private void setBlendingMode(int mode)
{
switch (mode)
{
case 0: // '\0'
gl10.glEnable(3042);
gl10.glBlendFunc(770, 771);
// GL10.GL_ONE_MINUS_SRC_ALPHA = 771
// GL10.GL_SRC_ALPHA
= 770
break;
case 1: // '\001'
gl10.glEnable(3042);
gl10.glBlendFunc(770, 1);// GL10.GL_ONE
= 1
break;
}
}
总结,
事实几个方法归结起来都是同一原理,修改对象在渲染时使用的ALPHA模式,这是属于opengl的知识范畴,
花了半天时间,彻底研究了下这个问题,发现还是opengl得基础知识不够牢固,老老实实打好opengl的基础知识才能在遇到问题时,最快最准确的察觉出问题的原理所在,OK这个问题告一段落····
布局为
<FrameLayout>
<SurfaceView />
<GLSurfaceView />
</FrameLayout>
其中,SurfaceView是用于照相预览的,GLSurfaceView用于jpct-ae的3D绘图。
为了让相机预览显示出来,我将GLSurfaceView的背景设置为透明
mGLView.setZOrderOnTop(true);
mGLView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mGLView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
在完成上面设置后,相机预览在GLSurfaceView后正常显示出来。
然后用jpct-ae进行绘图时,发现了这么一个问题:
在GLSurfaceView中先画一个不透明的图,然后再画一个半透明的图,
混色出来的结果中缺会出现摄像头的图像,
也就是,不透明的图没有把相机预览的图像挡住。
百思不得其解,是否是引擎本身的算法没有考虑到这个问题?
现象如图:
这个问题初看到让我觉得莫名其妙,混色的结果完全就不符合常理,于是乎,网上各种查,jpct官网(http://www.jpct.net/jpct-ae/)论坛各种找,都没能找到问题所在,于是乎,反编译jpct-ae.jar引擎库,直接查看源码。
目前遇到的有三个类有相似现象,解决方法分别如下:
1.
Object3D.setTransparencyMode(TRANSPARENCY_MODE_ADD);
2.
Overlay.setTransparencyMode(TRANSPARENCY_MODE_ADD);
3.
FrameBuff.blit(tex, 0, 0, 0, 0, 128, 128, 128, 128, 10,true,null);// additive 设为true
查看GLRenderer 源码:
这是几个方法改变的值,最后的应用
private void setBlendingMode(int mode)
{
switch (mode)
{
case 0: // '\0'
gl10.glEnable(3042);
gl10.glBlendFunc(770, 771);
// GL10.GL_ONE_MINUS_SRC_ALPHA = 771
// GL10.GL_SRC_ALPHA
= 770
break;
case 1: // '\001'
gl10.glEnable(3042);
gl10.glBlendFunc(770, 1);// GL10.GL_ONE
= 1
break;
}
}
总结,
事实几个方法归结起来都是同一原理,修改对象在渲染时使用的ALPHA模式,这是属于opengl的知识范畴,
花了半天时间,彻底研究了下这个问题,发现还是opengl得基础知识不够牢固,老老实实打好opengl的基础知识才能在遇到问题时,最快最准确的察觉出问题的原理所在,OK这个问题告一段落····
相关文章推荐
- 关于Android 4.4相机预览、录像花屏的问题的解决方法
- 关于SurfaceView相机预览获取Bitmap的方法
- Android中关于自定义相机预览界面拉伸问题
- (Android)Vuforia Native版本与jpct-ae结合
- 关于jpct_ae使用踩坑
- 关于Struts2与hibernate结合出错的问题!------java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I问题解决及总结
- 关于自定义相机预览界面拉伸问题
- 关于turbine集群监控与消息代理结合出错的问题
- ajaxFileUpload结合图片预览(可控制上传的张数)
- 关于C++语法的一个容易出错的地方。
- linux内核的水很深,分享一下关于__raw_writel()出错的问题
- 关于蓝牙socket 服务器端首次accept总出错!
- 项目的简单总结一 -- 关于对贝塞尔和shapelayer结合使用的动画特效
- 关于dpkg:处理 xxx (--configure)时出错(ubuntu12.04)
- android OpenGL开发使用JPCT-AE引擎显示3D立方体
- 关于JS提供的打印预览(限定每页打印条数)
- iOS学习:调用相机,选择图片上传,带预览功能
- iPhone上关于相机拍照的图片的imageOrientation的问题
- 关于6.0手机的从相册或相机选择图片
- 关于Struts 2对Date类型的自动类型转换出错的问题