Cocos2dx + OpenCV 实现背景透明,3D叠加
目前遇到一个问题,3d物体可以显示,Camera也可以显示,但是加在一起,3D部分无法实现透明。
解决方案: 深挖cocos2dx渲染流程
cocos2dx android平台的渲染流程如下:
首先在java层中,我们通过启动activity,也就是下面的activity,
而后到我们的AppActivity类里看看,就是下面这里第一个红圈,后面几个红圈接下来都会说到的,别急。
接下来我们可以知道,AppActivity继承了Cocos2dxActivity这个类,原来是cocos2dx封装了Activity,不错,不错,继续分析,继续挖。
我们打开图一中的第二个红圈,Cocos2dxActivity类
public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener
可以看到它是个抽象类,那么这个类究竟干了什么事?
它继承自我们伟大的android Activity,自然而然可以override我们的onCreate(…),onStart(…)等等一系列方法,这一部分我就不多说了,android的生命周期知识,重点看这个
仔细看这个方法,他很机智的用代码添加布局并设置相应的参数,有木有很棒,添加了一个FrameLayout和一个EditBox,重点是下面添加的mGLSurfaceView,通过调用onCreateView()方法,实例化了一个Cocos2dxGLSurfaceVew,并返回该引用,这个SurfaceView正如一个画板,接下来看看Cocos2dxGLSurfaceView类, 也就是图一中的第三个红圈
public class Cocos2dxGLSurfaceView extends GLSurfaceView {
}
同样的它也继承自android的GLSurfaceView,好吧,其实没啥看的,看看android的就够了,我们回到上一个init方法里,看到下面两行
也就是说,该SurfaceView设置了一个Cocos2dxRenderer实例,这个Render也相当于画笔,这个画笔神奇了,jni层的东西都通过java层绘制, 接下来我们看看这个Cocos2dxRenderer类,重点看下面这两个方法
先看看onDrawFrame里的,显然是画帧的操作,里面调用了一个nativeRender()方法,他们上面第一个nativeInit()方法一样,是通过jni调用,我们找找, 这个目录里的cpp文件是jni调用的C++实现,下面右边的图是jni目录
先来看看右边jni目录下的Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp文件
这是nativeRender()方法的实现,进入的就是Director单实例的mainLoop(),先记着,我在这个文件中并未找到nativeInit(),它在哪?
你答对了,就在上图左边那个javaactivity-android.cpp文件里
可以看到这里面做了一些动作,getOpenGLView()这个方法,据说在android平台是返回null的,我没具体调研,在意的是后面那个run()方法,它做了一些初始化操作,在VS上开发时都会有个AppDelegate.cpp类,在对应的声明文件中,可以看到它继承自Application,接下来就是C++里的一些流程了。看看nativeInit的那个mainLoop()方法,
有一个drawScene(),这就是我们需要关注的一个方法,如果是需要做透明层处理的话,在这个方法里,添加下面两行代码,这是因为需要做刷帧操作,仅在Director::setGLDefaultValues中使用glClearColor(0.0f, 0.0f, 0.0f, 0.0f)初始化是不够的
好了,就说这么多了,之前看了一下http://www.2cto.com/kf/201409/335933.html 帖子,写的很好,感谢笔者。