Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Совмещение изображений с нескольких камер или дублирование изображения с одной камеры со смещением

#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: я сделал чтобы копий всегда было нечетное число, так было проще, могу сделать поддержку черного числа копий

Комментариев нет:

Отправить комментарий