0

我想为绘图文本添加模糊效果。我使用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);
        }
    }

结果我在文本周围有一个黑暗区域。 在此处输入图像描述(红色背景更好地演示 - 模糊仅应用于具有透明度的文本。)

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

4

1 回答 1

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);
        }
    }

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

于 2015-04-10T08:09:09.057 回答