您的位置:首页 > 其它

关于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这个问题告一段落····
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: