布局为
<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这个问题告一段落····