2017-05-26 3 views
0

Ich versuche, einen Post-Processing-Effekt zu schreiben, der ändert, was schließlich auf den Bildschirm gezeichnet wird. Dies erfordert jedoch, dass das, was gerade gezeichnet wird, abgerufen, geändert und dann zurück gezeichnet wird.Probleme mit Post-Processing-Effekten haben

Die ersten beiden Schritte scheinen gut zu funktionieren. Der dritte Schritt .... macht alles Grau.

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); 
    } 
} 

Mein Ziel ist schließlich die Leitung von der Texture2D gezogen zu nehmen und sie zurück in die Textur an einer anderen Stelle zu platzieren, eine Verzerrung zu schaffen. Was ich gerade bekomme, ist nutzlos. Ich kann sehen, dass die Texture2D.ReadPixels() Aufruf einwandfrei funktioniert, wie ich sehen kann, dass die roten Pixel des UI-Bilds in der Textur (über die Debug-Zeile) und schwarz für den Anfang dieser Spalte sichtbar sind (was richtig ist: die Kamera rendert einen Volumenkörper schwarzer Hintergrund, nicht die Skybox). Wenn Sie diese Textur jedoch zurück auf den Bildschirm blättern, wird nichts Grau verwendet.

Wenn ich stattdessen Graphics.Blit(src, dest); mache, dann macht es die Szene gut.

aktualisieren

Nach der Zugabe von proc.Apply() ist der Bildschirm nicht mehr grau. Es ist jedoch, verzerrt stark:

Color corruption

Szene Ansicht annähert, was die Kamera machen sollte, während die Kamera-Ansicht zeigt, was tatsächlich gemacht hat (auch hier keine Skybox, obwohl sie drehen die eine gesamte Ansicht macht auf Aufstand von Rot und Purpur).

Update 2

gab ich die Dinge ein Gleichgewicht geraten auf einer anderen Maschine eine andere (ältere) Version von Unity läuft annd ... es funktioniert. Ich hätte erkennen sollen, dass es in erster Linie ein Unity-Bug war (das ist die dritte eine, die ich in 5,6 gefunden habe und die zweite diese Woche).

All fine: look at that lovely distortion

+0

Versuchen Sie, proc.Apply(); nach ReadPixels – JoRouss

+0

@JoRouss danke für den 'Apply()' Aufruf, definitiv geholfen. – Draco18s

+0

@JoRouss Hey, lösche deine Antwort, stellt sich heraus, dass das sekundäre Problem ein Einheitswanze ist. – Draco18s

Antwort

1

Ich habe nicht versucht, aber es sieht aus wie Sie nach proc.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0);-proc.Apply(); vergessen

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 wird die Bildschirmpixel von Bildschirm in den gespeicherten Texturdaten übernehmen. Sie müssen die Änderungen anschließend übernehmen(), damit sie tatsächlich gespeichert werden.

Anwenden ist eine potenziell kostspielige Operation, daher sollten Sie zwischen Anrufen so viele Pixel wie möglich ändern.

Quelle: Texture2D.Apply

Ich denke, Sie sollten Ihre Linie Operationen Anwenden nur tun, vor() und Blit()

Idealy, sollten Sie diese Vorgänge in einem Shader tun.