【问题标题】:Having Trouble With Post Processing Effects后期处理效果有问题
【发布时间】:2017-10-27 15:17:05
【问题描述】:

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

前两个步骤似乎工作得很好。第三步....渲染全部为灰色。

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() 后屏幕不再是灰色的。然而,它严重失真

场景视图近似于相机应渲染的内容,而相机视图显示实际渲染的内容(同样,没有天空盒,尽管打开它会使整个视图充满红色和紫色)​​。

更新 2

我在另一台运行不同(较旧)版本的 Unity 的机器上进行了测试,并且......它可以工作。我应该首先意识到这很可能是一个 Unity 错误(这是我在 5.6 中发现的第三个​​,以及本周的第二个)。

【问题讨论】:

  • 尝试添加 proc.Apply(); ReadPixels 之后
  • @JoRouss 感谢Apply() 的来电,绝对有帮助。
  • @JoRouss 嘿,取消删除你的答案,原来第二个问题是一个统一错误。
  • 哦,好的!我自己尝试过,但无法正常工作:O 你找到解决方法了吗?
  • @JoRouss 我的家用机器有一个旧版本的 Unity,它在那里工作正常。当我回到办公室时,我会向 Unity 提交错误报告。该问题不会使您的答案无效,因为我 错过了 .Apply() 电话。

标签: c# unity3d unity5 post-processing


【解决方案1】:

我没试过,不过好像你在proc.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0);之后忘了proc.Apply();

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 会将屏幕像素从屏幕获取到保存的纹理数据中。 之后您需要 Apply() 更改,以便实际保存它们。

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

来源:Texture2D.Apply

我猜你应该在 Apply() 和 Blit() 之前做你的线路操作

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2022-11-24
    相关资源
    最近更新 更多