如何在没有着色器的情况下模糊SDL_Surface?

时间:2015-04-08 17:53:51

标签: sdl transparency blur sdl-ttf

我想为绘图文字添加模糊效果。我使用SDL2SDL_TTF SDL_Surface具有透明度 如何在没有着色器的情况下执行此操作? 以下是我使用的算法。这是一个简单的平均值。

    Uint32 p;
    Uint8 r, g, b, a;       
    int x, y, px, py;
    int blur_sum_factor;
    for (y = 0; y < sfc_blur->h; y++)
    {
        for (x = 0; x < sfc_blur->w; x++)
        {
            double rd = 0.0, gd = 0.0, bd = 0.0, ad = 0.0;
            blur_sum_factor = 0;
            for (py = -blur_size; py <= blur_size; py++)
            {
                for (px = -blur_size; px <= blur_size; px++)
                {
                    int x1 = x + px;
                    int y1 = y + py;
                    if (x1 < 0 || x1 >= sfc_blur->w || y1 < 0 || y1 >= sfc_blur->h)
                        continue;
                    p = get_pixel32(sfc_blur, x1, y1);
                    SDL_GetRGBA(p, sfc_blur->format, &r, &g, &b, &a);
                    rd += r;
                    gd += g;
                    bd += b;
                    blur_sum_factor++;
                    ad += a;
                }
            }
            rd /= blur_sum_factor;
            gd /= blur_sum_factor;
            bd /= blur_sum_factor;
            ad /= blur_sum_factor;
            r = (Uint8)rd;
            g = (Uint8)gd;
            b = (Uint8)bd;
            a = (Uint8)ad;
            p = SDL_MapRGBA(sfc_blur_target->format, r, g, b, a);
            put_pixel32(sfc_blur_target, x, y, p);
        }
    }

结果我在文本周围有一个黑暗的区域。 enter image description here(红色背景可以更好地演示 - 模糊仅应用于具有透明度的文本。)

P.S。我从未使用过着色器。在这个任务中我不能使用着色器(即使我想要它)。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我创建了两个SDL_Surface:第一个文本和第二个文本背景颜色。然后我制作了一个模糊的alpha通道:

    for (y = 0; y < sfc_blur->h; y++)
    {
        for (x = 0; x < sfc_blur->w; x++)
        {
            double rd = 0.0, gd = 0.0, bd = 0.0, ad = 0.0;
            blur_sum_factor = 0;
            for (py = -blur_size; py <= blur_size; py++)
            {
                for (px = -blur_size; px <= blur_size; px++)
                {
                    int x1 = x + px;
                    int y1 = y + py;
                    if (x1 < 0 || x1 >= sfc_blur->w || y1 < 0 || y1 >= sfc_blur->h)
                        continue;
                    p = get_pixel32(sfc_blur, x1, y1);
                    SDL_GetRGBA(p, sfc_blur->format, &r, &g, &b, &a);
                    blur_sum_factor++;
                    ad += a;
                }
            }
            ad /= blur_sum_factor;
            p = get_pixel32(sfc_blur_target, x, y);
            SDL_GetRGB(p, sfc_blur_target->format, &r, &g, &b);
            a = (Uint8)ad;
            p = SDL_MapRGBA(sfc_blur_target->format, r, g, b, a);
            put_pixel32(sfc_blur_target, x, y, p);
        }
    }

接下来我想添加高斯模糊并将过程并行化。

相关问题