我试图编写一个后处理效果,改变最终绘制到屏幕上的内容。但是,这需要获取当前正在绘制的内容,修改它,然后将其绘制回来。
前两个步骤似乎工作正常。第三步......渲染所有灰色。
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中找到的,第二个本周)。< / p>
答案 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将屏幕上的屏幕像素转换为保存的纹理数据。 您需要在此之后应用()更改,以便实际保存它们。
应用是一项可能很昂贵的操作,因此您需要在应用调用之间更改尽可能多的像素。
我想你应该在Apply()和Blit()
之前进行你的直线操作理想情况下,您应该在着色器中执行这些操作。