2017-05-26 56 views
0

我試圖編寫一個後期處理效果,改變最終繪製到屏幕上的內容。但是,這需要獲取當前正在繪製的內容,對其進行修改,然後再繪製回來。遇到後期處理效應的問題

前兩個步驟似乎工作得很好。第三步......呈現灰色。

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 annd的......它工作在不同的機器上。我應該已經意識到它可能首先是一個Unity bug(這是我在第5.6版中找到的第第三個和本週的第二個)。

All fine: look at that lovely distortion

+0

嘗試添加proc.Apply(); ReadPixels後 – JoRouss

+0

@JoRouss感謝您的應用()'調用,肯定有幫助。 – Draco18s

+0

@JoRouss嘿,取消刪除你的答案,事實證明,第二個問題是一個團結的錯誤。 – Draco18s

回答

1

我還沒有嘗試過,但它看起來像你忘了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

我猜你應該做你的作業線前應用()和BLIT()

Idealy,你應該在着色器執行這些操作。