1

我有两层正在绘制。一个静态背景纹理和一个带有透明部分的纹理(png)。我可以毫无问题地正确看到背景。我想做的是通过绘制一个多边形(矩形)来修改顶层,该多边形(矩形)的大小会在运行时改变,使顶层的那部分透明,所以你只看到那个静态背景。

我在 iphone 上使用 Cocos2d 并找到了作者的一个很好的解决方案(参见 #6),但在他的示例中,他使用另一个 PNG 文件作为掩码。由于我的透明部分将在运行时以可变高度和宽度创建,因此图像不起作用。我认为一遍又一遍地绘制图像(蒙版)的开销也很大。

我已经对此进行了一段时间的研究,发现一些人谈论仅将多边形绘制到 Alpha 通道,我已经能够让多边形绘制到该通道,它不会使其透明,只是稍微亮一点的颜色。

我希望我只是缺少一些简单的东西:

        RenderTexture *mBurnLayer = [RenderTexture renderTextureWithWidth:512 height:512];
    Sprite *burn = [Sprite spriteWithFile:@"bg-new.png"];
    [burn setPosition:cpv(480/2,320/2)];
    [mBurnLayer setPosition:cpv(256,256)];
    [mBurnLayer begin];
    glColorMask(TRUE, TRUE, TRUE, TRUE);
    [burn visit];
    glColorMask(TRUE, TRUE, TRUE, FALSE);
    [mBurnLayer end];
    [self addChild:mBurnLayer];

    [mBurnLayer begin];
    glColorMask(FALSE, FALSE, FALSE, TRUE);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    glColor4ub(1, 1, 1, 0.5);
    glLineWidth(10);
    CGPoint vertices[] = { ccp(100,100), ccp(100,200), ccp(200,200), ccp(200,100) };
    drawPoly( vertices, 4, YES);
    glColorMask(TRUE, TRUE, TRUE, TRUE);

我已经尝试了 GL_ONE GL_ZERO GL_ALPHA_FROM_SRC 等的大量不同组合......

进一步阅读也许我只需要剪裁纹理?没有着色器这可能吗?我知道 iPhone 3GS 可以做着色器,但早期的不能。

4

1 回答 1

3

我想通了,这是供任何需要它的人将来参考的代码。

RenderTexture *bigBackgroundLayer = [RenderTexture renderTextureWithWidth:512 height:512];
Sprite *bigBackgroundSprite = [Sprite spriteWithFile:@"big_bg.png"];
[bigBackgroundSprite setPosition:cpv(240,150)];
[bigBackgroundLayer setPosition:ccp(240,150)];
[bigBackgroundLayer begin];
glColorMask(TRUE, TRUE, TRUE, TRUE);
[bigBackgroundSprite visit];
glColorMask(TRUE, TRUE, TRUE, FALSE);
[bigBackgroundLayer end];
[self addChild:bigBackgroundLayer z:0];

RenderTexture *gameBoardLayer = [RenderTexture renderTextureWithWidth:512 height:512];
Sprite *gameBoardSprite = [Sprite spriteWithFile:@"bg-new.png"];
[gameBoardSprite setPosition:cpv(480/2,320/2)];
[gameBoardLayer setPosition:cpv(256,256)];
[gameBoardLayer begin];
glColorMask(TRUE, TRUE, TRUE, TRUE);
[gameBoardSprite visit];
glColorMask(TRUE, TRUE, TRUE, FALSE);
[gameBoardLayer end];
[self addChild:gameBoardLayer];

[gameBoardLayer begin];
glColorMask(FALSE, FALSE, FALSE, TRUE);
glBlendFunc(GL_ONE, GL_ZERO);
glColor4ub(1, 1, 1, 0.0);
glLineWidth(10);
CGPoint vertices[] = { ccp(100,100), ccp(100,300), ccp(300,300), ccp(300,100) };
drawPoly( vertices, 4, YES);
glColorMask(TRUE, TRUE, TRUE, TRUE);
[gameBoardLayer end];

这将 gameBoardSprite 与 bigBackgroundSprite 混合在一起。使用内置的 drawPoly 函数,这只会将矩形绘制为线条,我修改了函数以获取 GLEnum 模式的额外参数(不在此代码中)并将其设置为 GL_TRIANGLE_FAN 以填充多边形。

希望这对其他人有帮助。

于 2009-09-06T05:13:56.570 回答