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.
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:
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).
Versuchen Sie, proc.Apply(); nach ReadPixels – JoRouss
@JoRouss danke für den 'Apply()' Aufruf, definitiv geholfen. – Draco18s
@JoRouss Hey, lösche deine Antwort, stellt sich heraus, dass das sekundäre Problem ein Einheitswanze ist. – Draco18s