关于jpct-ae结合相机预览,半透明出错

来源:互联网 发布:apache工作模式 编辑:程序博客网 时间:2024/06/07 00:18
使用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这个问题告一段落····


原创粉丝点击