Qt5 qml 嵌入 cocos2d-x v3的渲染窗口出现异常

发布于 2021-11-30 09:20:00 字数 2980 浏览 851 评论 2

系统:        Ubuntu 14.04 x64

软件环境: Coco2d-x v3.3    Qt5.4

技术实现方式:

  1.  在继承自QQuickItem的类中,注册QQuickWindow的beforeRendering信号到槽函数render。render中调用cocos2d::Director::getInstance()->mainloop(); 
  2. 在qml中创建1中子类的对象用来绘制cocos的glview
  3. 主要代码截图:
    void CCQRenderItem::sync()
    {
    	if (!m_ccinited && setCurretOpenGLContext(window()->openglContext())) {
    		if  (cocos2d::Application::getInstance()->applicationDidFinishLaunching()) {
    			m_ccinited = true;
    			glPushAttrib(GL_ALL_ATTRIB_BITS);
    			connect(qGuiApp, SIGNAL(applicationStateChanged(Qt::ApplicationState)), this,
    			        SLOT(handleWindowSt(Qt::ApplicationState)));
    			connect(window(), SIGNAL(beforeRendering()), this, SLOT(render()), Qt::DirectConnection);
    		} else {
    			cocos2d::Director::sharedDirector()->end();
    			qGuiApp->quit();
    			return;
    		}
    	}
    	static float rat = window()->devicePixelRatio();
    	glViewport(x(), y(), rat * width(), rat * height());
    	window()->update();
    }
    
    void CCQRenderItem::render()
    {
    	glPopAttrib();
    	cocos2d::Director::getInstance()->mainLoop();
    	glPushAttrib(GL_ALL_ATTRIB_BITS);
    }


    Item {
    	id: root
    	width: 480
    	height: 800
    
    	CCQRenderItem {
    		id: defRender
    		x:0
    		y:0
    		width: root.width
    		height: root.height
    		focus: true
    	}
    }


设想情况: cocos的glview和Qt的qmlview同时渲染到一个窗口,并且qmlview绘制在上层。

在没有调用window()->update()的情况下出现此种预想的效果。

但是render接口不会被循环调用,无法保证cocos正常运行。

实际遇到的问题:

  

  如左图,若不在qml中添加其它可绘制的qml元素那么cocos的glview将正常绘制

  如右图,若在qml中添加一个红色的矩形(代码如下),那么将不能正常的绘制出cocos

  的glview。    

Item {
	id: root
	width: 480
	height: 800
       // CCQRenderItem是C++中注册的用来绘制cocos的glview的QQuickItem子类
	CCQRenderItem {
		id: defRender
		x:0
		y:0
		width: root.width
		height: root.height
		focus: true
	}

	Rectangle {
		width: 100
		height: 100
		color: "red"
	}
}
我不了解gl的状态切换。不知道是什么情况导致的texture丢失了。我猜是在render所处的渲染管线中,Qt会切换不同的gl状态,而这些切换的状态会


导致cocos2d-x中设置的渲染状态丢失,从而导致了纹理不能正常绘制。但是具体原因我不知道。

求助,不胜感激。


 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泛泛之交 2021-11-30 12:11:14

我没有解决啊。应该是cocos2d-x需要保存一些状态。而qml开始会清空所有状态。

心舞飞扬 2021-11-30 11:06:00

不知道你解决了没有。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文