Сохранить текстуру из прожектора Unity

Есть прожектор на сцене. На нем свой материал с текстурой. Есть несколько шестиугольников, каждый тоже со своим материалом, цветом и текстурой. Прожектор проецирует на них свой материал, в результате чего мы видим наложение текстуры материала прожектора на текстуру шестиугольников, всё работает корректно и замечательно. введите сюда описание изображения

Теперь вопрос - как сохранить, запечь это проецируемое изображение в оригинальные материалы?

Все что я смог найти по этой теме - это довольно старый пост в Unity Answers, предоставлена последовательность действий для сохранения результата проектора в материале меша, куда проектируется.

This can actually be done with unity pro, and a bit of shader knowhow. What you do is you write a custom vertex shader that unwraps your mesh according to its UV structure and transforms it into screen space. Then you perform your regular texture projection in the same shader. Assign that shader to a material, assign that material to a projector, put that projector onto a layer, and cull the main camera from rendering that layer, then create a second camera that renders only that projector layer and tell it to render its output to a RenderTexture. You will then have a render texture with your projector sprite projected onto its UVs.

И предоставлен код шейдера - и судя по отзывам этот метод даже работает.

Shader "Custom/UnwrapShader" {
     Properties {
         _ProjectedTexture ("Projected Texture", 2D) = "" { TexGen ObjectLinear }
     }
     SubShader {
         Tags { "Queue" = "Transparent" }
         Pass {
             Cull Off
             AlphaTest Greater 0
             Blend SrcAlpha OneMinusSrcAlpha
             
             CGPROGRAM
 
             #pragma vertex vert_main
             #pragma fragment frag_main
             #include "UnityCG.cginc"
         
             sampler2D _ProjectedTexture;
             float4x4 _Projector;
         
             struct Output_Struct {
                 float4 position : SV_POSITION;
                 float4 texcoord : TEXCOORD0;
             };    
             
             Output_Struct vert_main (appdata_tan v) {
                 Output_Struct OUT;
 
                 OUT.position.xy = v.texcoord.xy * 2.0 - 1.0;
                 OUT.position.z = 0;
                 OUT.position.w = v.vertex.w;
                 
                 OUT.texcoord = mul(_Projector, v.vertex);
                 return OUT;
             }
             
             float4 frag_main (Output_Struct OUT) : COLOR {
                 half4 tex = tex2Dproj(_ProjectedTexture, UNITY_PROJ_COORD(OUT.texcoord)) * half4(1,0,0,1);
                 return tex;
             }
     
             ENDCG
         }
     }
 }

НО! Он пишет что результатом будет

You will then have a render texture with your projector sprite projected onto its UVs.

У вас будет текстура рендера с вашим спрайтом прожектора, проецируемая на UV меша.

Т.е. только ОДНА текстура - в которой будет сочетаться и старая текстура фигуры и текстура материала проектора. А если, как в моем слуае, у нас много фигур с разными материалами? Создавать под каждую из них камеру? Есть ли какой-нибудь более простой и очевидный способ сохранения проектируемой фигуры?


Ответы (0 шт):