@H_301_0@剪裁测试相关的关键字主要是 GL_SCISSOR_TEST glScissor() 之类的 ,具体api 可以自行查阅 OpenGL 资料。 @H_301_0@通过此问题,我进一步地了解了 opengl渲染管线 几个测试的 的意义 和 顺序关系 ,也进一步知道了这几个测试 都是发生在 fragment shader 之后。 @H_301_0@并且还了解到了 AndroidSDK 的一个分析渲染性能和渲染错误的工具 Tracer for OpenGL es,eclipse 如果安装了插件,就可以在eclipse里开启它了。 虽然最后解决问题没用到它,但是感觉这是一个不错的工具 。 @H_301_0@具体的用法 官方文档有介绍 。可是山炮 的 小米 2S上也跑步起来这个工具。
@H_301_0@解决了这个问题挺高兴,特此记录。
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(); } }