本文介绍了如何在没有着色器的情况下模糊SDL_Surface?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

结果是,文本周围有一个黑色区域。(为了更好地演示,红色背景-模糊仅应用于透明文本。)

附注:我从未使用过着色器。在此任务中,我不能使用着色器(即使我想要它)。

推荐答案

我解决了这个问题。我创建了两个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);
        }
    }

下一步,我要添加高斯模糊并并行化该进程。

这篇关于如何在没有着色器的情况下模糊SDL_Surface?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-15 11:24