遇到后期处理效果问题

时间:2017-05-26 16:44:18

标签: c# unity3d unity5 post-processing

我试图编写一个后处理效果,改变最终绘制到屏幕上的内容。但是,这需要获取当前正在绘制的内容,修改它,然后将其绘制回来。

前两个步骤似乎工作正常。第三步......渲染所有灰色。

Current behavior

public class PostProcess : MonoBehaviour {
    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        Texture2D proc = new Texture2D(src.width, src.height);
        proc.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0);
        Color[] line = proc.GetPixels(src.width / 2, 0, 1, src.height);
        Debug.Log(line[0] + " : "  + line[line.Length-1]);
        proc.Apply(); //per comments
        Graphics.Blit(proc, dest);
    }
}

我的目标是最终从Texture2D中拉出线并将其放回到另一个点的纹理中,从而产生失真。我目前得到的东西是没用的。我可以看到Texture2D.ReadPixels()调用执行得很完美,因为我可以看到该UI图像的红色像素在纹理中可见(通过调试行),黑色代表该列的顶部(这是正确的:相机呈现纯黑色背景,而不是天空盒)。然而,将纹理重新布置到屏幕上会导致无用的灰色。

如果我改为Graphics.Blit(src, dest);,那么渲染场景就好了。

更新

添加proc.Apply()后,屏幕不再灰显。然而,严重失真

Color corruption

场景视图近似于相机应该渲染的内容,而相机视图显示实际呈现的内容(同样,没有天空盒,虽然打开它会使整个视图成为红色和紫色的骚动)。

更新2

我在运行不同(较旧)Unity版本的另一台机器上发生了重击......它有效。我应该已经意识到它可能首先是一个Unity错误(这是第三个​​我在5.6中找到的,第二个本周)。< / p>

All fine: look at that lovely distortion

1 个答案:

答案 0 :(得分:2)

我还没有尝试过,但看起来你在proc.Apply();

之后忘了proc.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0);
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
    Texture2D proc = new Texture2D(src.width, src.height);
    proc.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0);
    //Do your line swapping on proc here
    proc.Apply();
    Color[] line = proc.GetPixels(src.width / 2, 0, 1, src.height);
    Debug.Log(line[0] + " : "  + line[line.Length-1]);
    Graphics.Blit(proc, dest);
}

ReadPixels将屏幕上的屏幕像素转换为保存的纹理数据。 您需要在此之后应用()更改,以便实际保存它们。

  

应用是一项可能很昂贵的操作,因此您需要在应用调用之间更改尽可能多的像素。

来源:Texture2D.Apply

我想你应该在Apply()和Blit()

之前进行你的直线操作

理想情况下,您应该在着色器中执行这些操作。