setPixels32() 统一创建空白纹理

setPixels32() in unity creates blank textures

我有一个 Texture2D 数组,webcamtexture 会在几秒钟内填充它。那部分工作正常,所有 50 个左右的帧都显示在检查器中。

现在我们通过调用 .GetPixels32() 来修改这些图像,为每一帧获取一个 Color32[]。例如,我们可以尝试将每个通道设置为当前帧和之前帧之间每个像素的 Math.Max(本质上是 'lighten' 混合),并用新修改的数组替换纹理质地。 (这段代码从第二帧开始,问题不是数组越界)

    Color32[] previousColors = previousFrame.GetPixels32();
    Color32[] currentColors = currentFrame.GetPixels32();
    Color32[] outColors = new Color32[colors.Length];
    int i = 0;
    while (i < currentColors .Length)
    {
        outColors[i].b = Math.Max(previousColors[i].b, currentColors[i].b);
        outColors[i].r = Math.Max(previousColors[i].r, currentColors[i].r);
        outColors[i].g = Math.Max(previousColors[i].g, currentColors[i].g);
    }
    bufferedPics[frameIndex].SetPixels32(outColors);
    bufferedPics[frameIndex].Apply();

这里是问题发生的地方:在检查器中,数组中的帧现在全部显示为空白。但是单击它们右侧的圆圈,它会显示经过适当修改、变亮的框架。尝试在其他地方使用这些框架,它们显示为空白和透明。

Color32四个通道 :红色、绿色、蓝色和 alpha。默认情况下,alpha 为 0(表示透明)。您必须将 alpha 设置为 255 以使图像不透明。

Color32[] previousColors = previousFrame.GetPixels32();
Color32[] currentColors = currentFrame.GetPixels32();
Color32[] outColors = new Color32[colors.Length];
int i = 0;
while (i < currentColors .Length)
{
    outColors[i].b = Math.Max(previousColors[i].b, currentColors[i].b);
    outColors[i].r = Math.Max(previousColors[i].r, currentColors[i].r);
    outColors[i].g = Math.Max(previousColors[i].g, currentColors[i].g);
    <b>outColors[i].a = 255;  // set the alpha channel to opaque</b>
}
bufferedPics[frameIndex].SetPixels32(outColors);
bufferedPics[frameIndex].Apply();