我真的很想解决这个问题,所以任何帮助都会非常感激。我试图隐藏大部分精灵并逐渐显示它。如果我只使用矩形,这可以正常工作。例如,我发现某人的“ClippingNode”类的实现,它运作良好,即代码的这一部分:
-(void) visit
{
glPushMatrix();
glEnable(GL_SCISSOR_TEST);
glScissor(clippingRegion.origin.x + positionInPixels_.x, clippingRegion.origin.y + positionInPixels_.y, clippingRegion.size.width, clippingRegion.size.height);
[super visit];
glDisable(GL_SCISSOR_TEST);
glPopMatrix();
}
问题是我需要一个不规则的形状,而不仅仅是一个矩形。我希望我可以堆叠调用glScissor并创建一个带有许多小矩形的形状,但不幸的是glScissor只能工作一次(最后一次调用它)。
似乎cocos2d不支持OpenGLs模板缓冲区(是吗?),即使它确实如此,我发现OpenGL很难理解,我仍然需要有人向我解释。如果我可以在精灵上设置一个bezier路径作为掩码(我认为你可以在Quartz中做),那就太棒了,但它似乎不支持。
如果有人在这里有任何智慧,那就太棒了!
答案 0 :(得分:1)
使用glScissor是不可能的,但您可以使用模板缓冲区轻松实现此效果。这是文档:
http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html
还有一个关于模板缓冲区的NeHe教程,但它是用C ++编写的,而不是目标C(虽然它很容易转换成你需要的任何应用程序):
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26
编辑:这是基于你想要将它剪裁成任意形状的假设,例如星星,笑脸等等,而不仅仅是一个矩形。
答案 1 :(得分:1)
想出来。你可以多次调用glScissor,你也需要每次都画出那个剪裁的形状:
-(void) visit
{
NSEnumerator *enumerator;
NSValue *val;
CGRect aRegion;
glPushMatrix();
glEnable(GL_SCISSOR_TEST);
enumerator = [regions objectEnumerator];
while ((val = (NSValue *)[enumerator nextObject])) {
aRegion = [val CGRectValue];
glScissor(aRegion.origin.x, aRegion.origin.y,
aRegion.size.width, aRegion.size.height);
[super visit];
}
glDisable(GL_SCISSOR_TEST);
glPopMatrix();
}