У меня есть отдельная камера от моей основной камеры, цель которой - делать снимки экрана под разными углами. Иерархия как таковая:
- Основная камера захватывает трехмерную сцену, как обычная основная камера, включая компоненты постобработки.
- Камера GUI захватывает только слой пользовательского интерфейса.
- Холст и изображение - это просто водяные знаки, отображаемые камерой GUI.
Я указываю основную камеру и GUI камеру на одну и ту же целевую текстуру рендеринга. Результат рендеринга текстуры выглядит корректным в инспекторе.
Затем я преобразую его в обычный Texture2D, чтобы его можно было сохранить:
RenderTexture.active = renderTexture;
destination.ReadPixels(new Rect(0f, 0f, renderTexture.width, renderTexture.height), 0, 0);
destination.Apply();
Когда я смотрю на получившуюся текстуру при проверке, она выглядит правильно. Но если я посмотрю на миниатюру полученной текстуры, то она покажет только то, что я предполагаю, это цветение.
(на черном, чтобы его было легче увидеть.)
Я также пробовал AsyncGPUReadback. Получающаяся в результате текстура в Инспекторе выглядит как плоская серая без отклонений.
Независимо от того, как я преобразую текстуру рендеринга в обычную текстуру, в результирующем PNG на диске присутствует только цветение.
(на черном, чтобы было легче увидеть.)
Я обнаружил, что если я отключаю постобработку, все работает как задумано, никаких изменений не требуется. Конечно, мне не хватает постобработки, которую я хочу!
РЕДАКТИРОВАТЬ: После дальнейших исследований выясняется, что методы кодирования Unity опираются на что-то внешнее по отношению к самой текстуре, в результате чего она сохраняет неправильные данные. Если я использую отдельный кодировщик PNG, использующий те же данные Color32, все работает как положено.
Мне все еще любопытно, каков «правильный» способ сделать это, хотя у меня есть путь вперед, по крайней мере.