Qt5 qml 嵌入 cocos2d-x v3的渲染窗口出现异常
系统: Ubuntu 14.04 x64
软件环境: Coco2d-x v3.3 Qt5.4
技术实现方式:
- 在继承自QQuickItem的类中,注册QQuickWindow的beforeRendering信号到槽函数render。render中调用cocos2d::Director::getInstance()->mainloop();
- 在qml中创建1中子类的对象用来绘制cocos的glview
- 主要代码截图:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我没有解决啊。应该是cocos2d-x需要保存一些状态。而qml开始会清空所有状态。
不知道你解决了没有。