我正在制作一个脚本,在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++;
}
我试着用颜色来做这个。然后,我认为这是一个舍入错误时,划分的颜色分量,并试图做同样的类型双为每个分量的颜色,但结果是相同的。
需要帮助:)
1条答案
按热度按时间cedebl8k1#
我认为你应该混合两个像素,而不是添加它们。另一点需要注意的是,将浮点转换为字节可能会溢出。
混合alpha通道有点特殊,通常如果当前像素是不透明的,你期望像素在混合后保持不透明,所以你原来的方法可以工作。