本文介绍了如何在没有着色器的情况下模糊SDL_Surface?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想将模糊效果添加到绘制文本。我使用SDL2
和SDL_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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!