Bạn có thể sử dụng API Unity để làm điều này. Không cần cho bất kỳ bên thứ 3. Unity tự kết xuất một khung, tại sao bạn lại cần một cái gì đó để hiển thị lại hoặc lưu trữ kết cấu được hiển thị từ bộ nhớ bên ngoài nó, khi bạn có thể làm điều này trong C #? Phải, không cần phải làm điều này. Nhưng tại sao điều này lại khó khăn như vậy? Tại sao tôi không thể lấy kết cấu này? Tôi thực sự không có câu trả lời đúng cho vấn đề này vì tôi không phải là chuyên gia về GPU. Nhưng theo như tôi biết, mặc dù GPU có bộ nhớ, nhưng nó sẽ xóa mọi thứ từ đó rất thường xuyên, tôi đoán mọi khung hình. (Xin vui lòng nếu bạn hiểu chủ đề này về GPU nhiều hơn tôi, hãy giải thích nó trong các bình luận, tôi rất biết ơn vì điều này).
Diễn đàn Unity này dành riêng cho câu hỏi này: Làm thế nào để truy cập bộ đệm độ sâu được kết xuất đúng cách?
Unity cho phép kết xuất camera theo cách thủ công: Camera Render .
Với một số mã:
Ngoài ra, nếu đây là VR hoặc không, chủ đề này chắc chắn sẽ hữu ích và sẽ tiết kiệm rất nhiều thời gian để tìm kiếm các lượt truy cập hiệu suất: Chụp ảnh thời gian thực trong 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();
Đây là mã từ tài liệu Unity về cách lưu trữ kết xuất vào 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);