unity3d Unity脚本中的添加图像

t40tm48m  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(151)

我正在制作一个脚本,在Unity中逐帧渲染场景,并将每一帧覆盖在前一帧上。原来是动态模糊。然后保存帧。问题开始了。问题是在叠加图片之后,伪影出现在最终图像上。
下图有两帧:在左侧-由一帧(运动模糊的1次迭代)组成的正常图像,在右侧-具有10个先前帧(运动模糊的10次迭代)的叠加的图像。
Image with problem
就像叠加后颜色深度发生变化一样。
这是负责覆盖帧的函数的代码:

//VFB is a video frame buffer. It is a type of Texture2D. 
//It is clearing after storing each frame.

//MoBlur_Steps int, the number of motion blur iterations.

   void Fill_VFB(Texture2D src)
    {
        UnityEngine.Color32[] src_pixels = src.GetPixels32();
        UnityEngine.Color32[] dest_pixels = VFB.GetPixels32();

        for (int i = 0; i < src_pixels.Length; i++)
        {
            dest_pixels[i].r = (byte)(dest_pixels[i].r + (float)src_pixels[i].r / MoBlur_Steps);
            dest_pixels[i].g = (byte)(dest_pixels[i].g + (float)src_pixels[i].g / MoBlur_Steps);
            dest_pixels[i].b = (byte)(dest_pixels[i].b + (float)src_pixels[i].b / MoBlur_Steps);
            dest_pixels[i].a = (byte)(dest_pixels[i].a + (float)src_pixels[i].a / MoBlur_Steps);
        }

        VFB.SetPixels32(dest_pixels);
        Render_Step++;
    }

我试着用颜色来做这个。然后,我认为这是一个舍入错误时,划分的颜色分量,并试图做同样的类型双为每个分量的颜色,但结果是相同的。
需要帮助:)

cedebl8k

cedebl8k1#

我认为你应该混合两个像素,而不是添加它们。另一点需要注意的是,将浮点转换为字节可能会溢出。

float f = 1f / MoBlur_Steps;
float t = dest_pixels[i].r * (1-f) + src_pixels[i].r * f;
dest_pixels[i].r = t >= 255f ? (byte)255 : (byte)t;

混合alpha通道有点特殊,通常如果当前像素是不透明的,你期望像素在混合后保持不透明,所以你原来的方法可以工作。

t = dest_pixels[i].a + src_pixels[i].a * f;
dest_pixels[i].a = t >= 255f ? (byte)255 : (byte)t;

相关问题