Sie können dazu die Unity-API verwenden. Keine Notwendigkeit für Dritte. Unity rendert einen Frame selbstständig. Warum benötigen Sie etwas, um ihn erneut zu rendern oder die gerenderte Textur aus dem Speicher außerhalb zu speichern, wenn Sie dies in C # tun können? Richtig, das ist nicht nötig. Aber warum ist das so schwer? Warum kann ich diese Textur nicht einfach nehmen? Ich habe nicht wirklich die richtige Antwort darauf, weil ich kein Experte für GPU bin. Aber soweit ich weiß, löscht die GPU, obwohl sie über Speicher verfügt, sehr oft alles von dort, ich denke, jeder Frame. (Bitte, wenn Sie dieses Thema über GPU viel besser verstehen als ich, erklären Sie es in Kommentaren, ich bin sehr dankbar dafür).
Dieses Unity-Forum widmet sich dieser Frage: Wie kann man richtig auf den gerenderten Tiefenpuffer zugreifen?
Mit Unity kann die Kamera manuell gerendert werden: Camera Render .
Mit etwas Code:
Wenn dies VR ist oder nicht, wäre dieser Thread auf jeden Fall hilfreich und spart viel Zeit bei der Suche nach den Performance-Hits: Echtzeit-Bildaufnahme in Unity .
// Setup a camera, texture and render texture
Camera cam = ...;
Texture2D tex = ...;
RenderTexture rt = ...;
// Render to RenderTexture
cam.targetTexture = rt;
cam.Render();
// Read pixels to texture
RenderTexture.active = rt;
tex.ReadPixels(rectReadPicture, 0, 0);
// Read texture to array
Color[] framebuffer = tex.GetPixels();
Hier ist der Code aus der Unity-Dokumentation zum Speichern von Rendering in PNG.
// We should only read the screen buffer after rendering is complete
yield return new WaitForEndOfFrame();
// Create a texture the size of the screen, RGB24 format
int width = Screen.width;
int height = Screen.height;
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
// Read screen contents into the texture
tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
tex.Apply();
// Encode texture into PNG
byte[] bytes = tex.EncodeToPNG();
Object.Destroy(tex);
// For testing purposes, also write to a file in the project folder
File.WriteAllBytes(Application.dataPath + "/../SavedScreen.png", bytes);