【发布时间】: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