绘制多边形以将纹理剪切为透明,其中多边形位于OpenGL ES中

时间:2009-09-05 18:13:33

标签: iphone opengl transparent textures

我画了两层。静态背景纹理和纹理(png)与透明部分。我可以正确地看到背景,没有任何问题。我想要做的是通过绘制一个大小将在运行时更改的多边形(矩形)来修改顶层,以使顶层的该部分透明,这样您就可以看到静态背景。

我在iphone上使用Cocos2d并且作者发现了一个不错的solution(参见#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可以做着色器,但早期的不能。

1 个答案:

答案 0 :(得分: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以填充多边形。

希望这对其他人有帮助。