在androID 手机上,大部分的机器模板测试都没问题。但是有一个奇葩的手机,小米2S,当只有一层需要模板测试的时候 ,在cocos2dx 里具体地说就是使用 CcclipPingNode 的时候 ,是没问题的 。但是当一个 CcclipPingNode嵌套另外一个 CcclipPingNode 时,就会出现各种显示不出来的问题。cocostudio 制作 GUI 里面许多面板,当开启剪裁功能后 ,比如 UIPageVIEw UIScrollVIEw 也都是靠 CcclipPingNode开启模板缓存来渲染的 。
原因没有具体弄明白,但是我用另外一个手段避开了这个问题。
因为是模板测试嵌套模板测试 时,才会有问题 ,并且这种问题很多出现在GUI上 ,GUI 的大背景通常是一个长方形 ,所以就把 GUI 的 renderer ,也就是 RectClipPingNode剪裁时的渲染方式,从使用模板测试,修改为使用剪裁测试,并根据剪裁区域设置 opengl 的剪裁区域, 渲染时从渲染 clipPing node,变为正常地渲染 普通 node .这样就比较完美地避开了了这个问题。
渲染前保存好 scissor相关的 参数,渲染后恢复即可。 cocos2dx渲染其他 opengl 特性的 node 的做法,通常也就是这样子的。具体可以参考 cocos2dx CcclipPingNode 的 visit() 方法。
剪裁测试相关的关键字主要是 GL_SCISSOR_TEST glScissor() 之类的 ,具体API 可以自行查阅 OpenGL 资料。
通过此问题,我进一步地了解了 opengl渲染管线 几个测试的 的意义 和 顺序关系 ,也进一步知道了这几个测试 都是发生在 fragment shader 之后。
并且还了解到了 AndroIDSDK 的一个分析渲染性能和渲染错误的工具 Tracer for OpenGL es,eclipse 如果安装了插件,就可以在eclipse里开启它了。 虽然最后解决问题没用到它,但是感觉这是一个不错的工具 。
具体的用法 官方文档有介绍 。可是山炮 的 小米 2S上也跑步起来这个工具。
解决了这个问题挺高兴,特此记录。
voID RectClipPingNode::visit(){ if (!m_bEnabled) { return; } if (m_bClipPingEnabled) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // some androID device,such as "mi 2s" do not support stencil test node in stencil test node // so when load cocostudio GUI,do not use stencil test,but use scissor test replace it. bool bEnabledScissorBefore = CCEGLVIEw::sharedOpenGLVIEw()->isScissorEnabled(); CCRect scissorRectBefore = CCEGLVIEw::sharedOpenGLVIEw()->getScissorRect(); // try to use Scissor Test replace Stencil Test glEnable(GL_SCISSOR_TEST); CCPoint worldPos = m_pParent->convertToWorldspace(getposition()); CCPoint anchor = getAnchorPoint(); CCPoint leftDownPos = ccp(worldPos.x - anchor.x * m_clipPingSize.wIDth,worldPos.y - anchor.y * m_clipPingSize.height); CCEGLVIEw::sharedOpenGLVIEw()->setScissorInPoints(leftDownPos.x,leftDownPos.y,m_clipPingSize.wIDth,m_clipPingSize.height); // @temp 0,0 CCNode::visit(); // restore opengl states bEnabledScissorBefore ? glEnable(GL_SCISSOR_TEST) : gldisable(GL_SCISSOR_TEST); CCEGLVIEw::sharedOpenGLVIEw()->setScissorInPoints(scissorRectBefore.origin.x,scissorRectBefore.origin.y,scissorRectBefore.size.wIDth,scissorRectBefore.size.height);#else CcclipPingNode::visit();#endif } else { CCNode::visit(); }}总结
以上是内存溢出为你收集整理的解决了一个cocos2dx 在部分 android手机上模板测试错误的问题全部内容,希望文章能够帮你解决解决了一个cocos2dx 在部分 android手机上模板测试错误的问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)