Страницы

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

Показаны сообщения с ярлыком шейдеры. Показать все сообщения
Показаны сообщения с ярлыком шейдеры. Показать все сообщения

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

пятница, 27 декабря 2019 г.

OpenGL шейдеры: стоит ли переходить на них?

#cpp #c #opengl #шейдеры


Стоит ли сейчас переезжать с glBegin на шейдеры? Зачем их вообще ввели? Для каждого
вида отрисовки свой писать что ли?
    


Ответы

Ответ 1



Стоит, потому что, начиная с OpenGl es 2.0 для мобильных и opengl 3.2 для настольных отрисовка осуществляется исключительно при помощи шейдеров. Если Вы планируете использовать opengl в своей профессиональной деятельности - однозначно изучайте шейдеры и новые версии opengl. Кроме того, тут всплывают нюансы с поддержкой той или иной версии конкретной видеокартой и extensions.

Ответ 2



Шейдеры исполняются прямо на процессоре видеокарты, освобождая центральный процессор для более важных задач. Заодно уменьшается время работы, так как видеокарта по определению менее загружена вычислениями, да еще и не нужно туда-сюда перекидывать данные - шейдеры работают с данными сразу в видеопамяти. Насчет того, стоит переходить или нет - зависит от конкретной ситуации. Сферически в вакууме - стоит.

Ответ 3



помимо шейдеров можно перейти еще и на вершинные буфферы (vbo или на vao), будет еще больший прирост производительности за счет хранения данных вершин на видеокарте, и быстрого обращения к памяти

среда, 25 декабря 2019 г.

GLSL, HLSL Шейдер из нескольких файлов

#opengl #directx #glsl #шейдеры


Например есть 3 шейдера. параллакс, бамп, и солид. В каждом шейдере должны быть общие
вычисления типа вычисления источников света. 

Реально ли в GLSL и HLSL вынести эти функции в отдельный файл и потом их как бы подключать
как .h файл к коду программы?
Каковы конструкции, ключевые слова в шейдерных языках и что нужно сделать в коде
программы для того чтобы их использовать?
    


Ответы

Ответ 1



Насколько мне видится, самым универсальным решением для HLSL и GLSL может быть написание своего простенького препроцессора, который будет вместо строке #include("bump.glsl") вставлять код этого файла. Также можно пытаться обойтись дефайнами и таким образом отключать или включать какие-то функции в шейдере. P.S. В вопросе наверное стоило указать версию GLSL и HLSL, которую вы планируете использовать.

понедельник, 9 декабря 2019 г.

Как в OpenGL или DirectX называется технология затенения углов?

#opengl #графика #directx #шейдеры #технологии


Это запеченные карты света? Или Есть какая то технология позволяющая сделать это
программно?




    


Ответы

Ответ 1



Этот эффект затенения на вашей картинке называется Ambient Occlusion или AO Он заключается в затенении поверхностей на основе информации об объектах (поверхностях) рядом. Реализаций AO много, например "пост-эффект" во фрагментном шейдере (Screen Space Ambient Occlusion или SSAO) на основе информации о положении пикселей и нормалях. Относительно прост и дешев, из за чего и популярен, не зависит от сложности сцены. К недостаткам алгоритма можно отнести невозможность обработки полу-прозрачных поверхностей + невозможность аппаратного сглаживания (antialiasing). SSAO можно отнести к технике так называемого отложенного рендеринга или deferred rendering (shading) , это такой фокус, когда вместо кадра на экране формирутся так называемый G-Buffer это несколько рендер текстур (render texture) в которые рисуется кадр, только кроме цвета в каждое значение пикселя записывается информация о: xyz пикселя относительно камеры векторе нормали к поверхности в этой точке любая другая информация (например о типе материала, глубине, и так далее) В последствии поверх всего экрана рисуется один треугольник, таким образом чтобы он закрыл весь экран. Это нужно чтобы вызвать фрагментный шейдер для каждого пикселя. В шейдере происходит вся магия. Там берется информация из сформированного недавно g-buffer и формируется кадр с освещением-затенением. Описанное выше это общая часть для множества алгоритмов освещения, затенения, фильтрации изображений и других странных фокусов вроде screen space reflections, работающих в экранном пространстве. т.е. их сложность растет не со сложностью сцены а с размером кадра. SSAO Если принять за освещенность точки сумму всех векторов фотонов из полусферы: и предположить что если рядом есть поверхность или объект, то фотоны через него не проходят, тогда получается что их можно не учитывать при расчете освещения. Улучшение результата возможно за счет учета нормалей для обработки плоских поверхностей: Так же дает хорошие результаты не простое монте-карло по соседним пикселям, а например, poisson sampling: Вот пример screen space AO на three.js. PS: заглядывайте сюда, попозже сделаю живой пример..

среда, 20 февраля 2019 г.

GLSL, HLSL Шейдер из нескольких файлов

Например есть 3 шейдера. параллакс, бамп, и солид. В каждом шейдере должны быть общие вычисления типа вычисления источников света.
Реально ли в GLSL и HLSL вынести эти функции в отдельный файл и потом их как бы подключать как .h файл к коду программы? Каковы конструкции, ключевые слова в шейдерных языках и что нужно сделать в коде программы для того чтобы их использовать?


Ответ

Насколько мне видится, самым универсальным решением для HLSL и GLSL может быть написание своего простенького препроцессора, который будет вместо строке #include("bump.glsl") вставлять код этого файла.
Также можно пытаться обойтись дефайнами и таким образом отключать или включать какие-то функции в шейдере.
P.S. В вопросе наверное стоило указать версию GLSL и HLSL, которую вы планируете использовать.

четверг, 6 декабря 2018 г.

OpenGL шейдеры: стоит ли переходить на них?

Стоит ли сейчас переезжать с glBegin на шейдеры? Зачем их вообще ввели? Для каждого вида отрисовки свой писать что ли?


Ответ

Стоит, потому что, начиная с OpenGl es 2.0 для мобильных и opengl 3.2 для настольных отрисовка осуществляется исключительно при помощи шейдеров. Если Вы планируете использовать opengl в своей профессиональной деятельности - однозначно изучайте шейдеры и новые версии opengl. Кроме того, тут всплывают нюансы с поддержкой той или иной версии конкретной видеокартой и extensions.