std::vector<std::vector<float>> createKernel(float blurValue,
float l_blurValue, float r_blurValue,
float t_blurValue, float b_blurValue,
float lt_blurValue, float rt_blurValue,
float lb_blurValue, float rb_blurValue) {
std::vector<std::vector<float>> kernel;
// if (isBounded) {
// kernel = {
{blurValue}};
// }
kernel = {
{lt_blurValue, t_blurValue, rt_blurValue},
{l_blurValue, blurValue, r_blurValue},
{lb_blurValue, b_blurValue, rb_blurValue}};
return kernel;
}
struct CompBlur : INode {
virtual void apply() override {
auto image = get_input<PrimitiveObject>("image");
auto s = get_input2<float>("strength");
auto ktop = get_input2<vec3f>("kerneltop");
auto kmid = get_input2<vec3f>("kernelmid");
auto kbot = get_input2<vec3f>("kernelbot");
auto &ud = image->userData();
int w = ud.get2<int>("w");
int h = ud.get2<int>("h");
auto blurredImage = std::make_shared<PrimitiveObject>();
blurredImage->verts.resize(w * h);
blurredImage->userData().set2("h", h);
blurredImage->userData().set2("w", w);
blurredImage->userData().set2("isImage", 1);
if(image->has_attr("alpha")){
blurredImage->verts.attr<float>("alpha") = image->verts.attr<float>("alpha");
}
std::vector<std::vector<float>>k = createKernel(kmid[1],kmid[0],kmid[2],ktop[1],kbot[1],ktop[0],ktop[2],kbot[0],kbot[2]);
int kernelSize = s * k.size();
int kernelRadius = kernelSize / 2;
// 计算卷积核的中心坐标
int anchorX = 3 / 2;
int anchorY = 3 / 2;
for (int iter = 0; iter < s; iter++) {
// 对每个像素进行卷积操作
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
float sum0 = 0.0f;
float sum1 = 0.0f;
float sum2 = 0.0f;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int kernelX = x + j - anchorX;
int kernelY = y + i - anchorY;
if (kernelX >= 0 && kernelX < w && kernelY >= 0 && kernelY < h) {
sum0 += image->verts[kernelY * h + kernelX][0] * k[i][j];
sum1 += image->verts[kernelY * h + kernelX][1] * k[i][j];
sum2 += image->verts[kernelY * h + kernelX][2] * k[i][j];
}
}
}
// 将结果赋值给输出图像
blurredImage->verts[y * w + x] = {static_cast<float>(sum0), static_cast<float>(sum1),
static_cast<float>(sum2)};
}
}
image = blurredImage;
}
set_output("image", blurredImage);
}
};
ZENDEFNODE(CompBlur, {
{
{"image"},
{"float", "strength", "5"},
{"vec3f", "kerneltop", "0.075,0.124,0.075"},
{"vec3f", "kernelmid", "0.124,0.204,0.124"},
{"vec3f", "kernelbot", "0.075,0.124,0.075"},
},
{
{"image"}
},
{},
{ "image" },
});