#c_sharp #unity3d #шейдеры
Прошу помочь в создании эффекта множественного "раздвоения" изображения с Unity камеры. На сцене есть камера и есть объект, допустим куб. Необходимо "размножить" объект при отрисовке. В приложенных изображениях показано исходное состояние и желаемое на экране. Прошу не предлагать дублирование объекта, ведь это ещё более ресурсозатратно, как я полагаю. Прошу ваших идей и предложений! UPD: Поясняю: В исходном состоянии на сцене есть одна камера и один объект-куб. Камера направлена на куб. Необходимо, чтобы по нажатию на кнопку объект "раздваивался"/множился (не знаю как ещё сказать), но при этом на сцене оставался в одном экземпляре. Вижу всего 2 возможных подхода: Создать ещё столько камер сколько должно быть объектов, разместить их с заданным шагом друг от друга и объединить изображение с них в одно общее, но, на сколько мне известно это резко понижает производительность т.к. рендеринг происходит для каждой из камер. Как второй вариант могу предположить, что подобное можно сделать с помощью вершинного или геометрического шейдера. Тогда и камера одна и объект на сцене один. Рисунок 1. Пример сцены без эффекта Рисунок 2. Пример сцены с эффектом (2 "камеры") Рисунок 3. Пример сцены с эффектом (3 "камеры") Рисунок 4. Пример сцены с эффектом (5 "камер")
Ответы
Ответ 1
Если я все правильно понял, Вам нужен пост-процессинг шейдер, который я и сделал: Весь фокус вот тут, смешиваем вместе N картинок со смещением по горизонтали в экранных координатах: for (int c = -_Count; c < _Count+1 ; c++) col += tex2D(_MainTex, float2(i.uv.x-d*c, i.uv.y))/(_Count*2+1); если потребуются объяснения пишите в комментах. Код шейдера целиком: Shader "Copier" { Properties { _MainTex ("Texture", 2D) = "white" {} _Count ("Count", Int) = 2 _Offset ("Offset", Float) = 1 } SubShader { Cull Off ZWrite Off ZTest Always Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; float _Offset; int _Count; fixed4 frag (v2f i) : SV_Target { fixed4 col = 0; float d = _Offset/100; if (_Count < 0) return tex2D(_MainTex, i.uv); for (int c = -_Count; c < _Count+1 ; c++) col += tex2D(_MainTex, float2(i.uv.x-d*c, i.uv.y))/(_Count*2+1); return col; } ENDCG } } } Свойства материала: и скрипт, его нужно повесить на камеру и в нем сослаться на материал с шейдером: using System.Collections; using UnityEngine; [ExecuteInEditMode] public class PostProcessingEffect : SceneViewFilter { public Material material; void OnRenderImage (RenderTexture source, RenderTexture destination) { Graphics.Blit (source, destination, material); } } Вот результат: PS: я сделал чтобы копий всегда было нечетное число, так было проще, могу сделать поддержку черного числа копий
Комментариев нет:
Отправить комментарий