【问题标题】:cocos2d outlinecocos2d 大纲
【发布时间】:2011-08-09 18:54:43
【问题描述】:

如何在 cocos2d 中根据 alpha 为纹理绘制轮廓?我有一个纹理,我想要 alpha 从 0 到非零的任何地方或类似的东西来画一条线,这样它就可以勾勒出所有的东西。

【问题讨论】:

  • 我也对此感兴趣,但我认为我们需要使用原始的 openGL 命令来执行此操作,这意味着它很重要..
  • @Lukman:我实际上解决了这个问题,但它不足以快速绘制任何帧(但我不需要那个)。我所做的是使用glCopyPixels,然后在像素上运行我自己的算法并将它们加载回我在屏幕上绘制的纹理。
  • 如果愿意,请回答您自己的问题。所以未来的观众可能会学习。
  • @Sold Out Activist:完成
  • @Lukman:如果你仍然感兴趣,我发布了我的解决方案。

标签: cocos2d-iphone


【解决方案1】:

我通过将图像复制到内存然后使用它自己解决了这个问题:
我使用了渲染纹理,但如果您不想使用,我添加了 cmets 来说明要更改的内容

    // Get the size of the render texture, change to size of screen if you don't
    // use render texture
    CGSize s = RenderedWall.sprite.texture.contentSizeInPixels;
    int tx = s.width;
    int ty = s.height;

    int bitsPerComponent            = 8;
    int bytesPerPixel               = (bitsPerComponent * 4)/8;
    int bytesPerRow                 = bytesPerPixel * tx;
    NSInteger myDataLength          = bytesPerRow * ty;

    NSMutableData *buffer = [[NSMutableData alloc] initWithCapacity:myDataLength];
    Byte *bytes = (Byte *)[buffer mutableBytes];

    glReadPixels(0, 0, tx, ty, GL_RGBA, GL_UNSIGNED_BYTE, bytes);

    NSMutableData *newBuffer = [[NSMutableData alloc] initWithBytes:bytes length:myDataLength];
    Byte *newBytes = (Byte *)[newBuffer mutableBytes];

    // free the render texture, remove this if you don't use one
    [RenderedWall end];

    for(int x = 0; x < tx; x++)
    {
        for(int y = 0; y < ty; y++)
        {
            int idx = y * bytesPerRow + x * bytesPerPixel + 3;

            int w = 1;

            if(bytes[idx] <= 254)
            {
                bool ok = false;
                for(int nx = -w; nx <= w; nx++)
                {
                    for(int ny = -w; ny <= w; ny++)
                    {
                        if(x + nx < 0 || y + ny < 0 || x + nx >= tx || y + ny >= ty)
                            continue;
                        if(bytes[idx + nx * bytesPerPixel + ny * bytesPerRow] == 255)
                        {
                            ok = true;
                            break;
                        }
                    }
                }
                if(ok)
                {
                    newBytes[idx - 3] = 0;
                    newBytes[idx - 2] = 0;
                    newBytes[idx - 1] = 0;
                    newBytes[idx] = 255;
                }
            }
        }
    }

    CCTexture2D *texture = [[CCTexture2D alloc] initWithData:newBytes
                                                 pixelFormat:kCCTexture2DPixelFormat_RGBA8888
                                                  pixelsWide:tx pixelsHigh:ty
                                                 contentSize:RenderedWall.sprite.texture.contentSize];

    // The outlined sprite comes here. If you don't use render texture, you need to add clear here.

    CCSprite *RenderedWallSprite = [CCSprite spriteWithTexture:texture];

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多