Шейдеры Unity. Получить экранное пространство четырехугольной выборки - PullRequest
0 голосов
/ 10 ноября 2019

Хотите получить координаты пространства экрана от (0,0) до (1,1) четырехугольника объекта, ограничивающего его вокруг
Попытка достичь этого результата вне зависимости от положения экрана и угла наклона камеры
enter image description here
Это простая ультрафиолетовая выборка с определенного угла
Мне нужно увидеть тот же результат с другой стороны, но с другой стороны есть ультрафиолетовый шов
enter image description here

1 Ответ

0 голосов
/ 11 ноября 2019

Для меня звучит как унитаз. Вы можете попробовать поискать "Unity Matcap Shader" и посмотреть, появится ли что-нибудь хорошее. Вот центральная часть вычисления (в вершинном шейдере):

o.uv = mul((float3x3)UNITY_MATRIX_V, UnityObjectToWorldNormal(v.vertex)).xy * 0.5 + 0.5;

РЕДАКТИРОВАТЬ: Таким образом, вы в основном хотите UV-пространства на экране, за исключением объекта в качестве источника. Я думаю, что вышеупомянутое решение все еще должно работать, если вы замените нормальное положение объекта.

o.uv = mul((float3x3)UNITY_MATRIX_V, v.vertex).xy * 0.5 + 0.5;

При этом будет использоваться позиция объекта в пространстве модели, повернутая в пространство экрана. Он должен работать, пока начало сетки находится в его центре. Обратите внимание, что диапазон UV-координат будет зависеть от размера модели (1 метр = 1 ультрафиолетовая плитка), поэтому вам может понадобиться умножить его на некоторый коэффициент.

РЕДАКТИРОВАТЬ2: Хорошо, поэтому я начинаю понимать немного больше, чего вы пытаетесь достичь. Если вы хотите, чтобы ультрафиолетовое пространство на экране относилось к границам объекта, вам нужно каким-то образом передать ограничивающую рамку пространства экрана в шейдер.

Я предлагаю добавить свойство вектора float4 к материалу. где XY - центр границ, а ZW - размеры блока, а затем установите его из кода, используя что-то вроде GetComponent<MeshRenderer>().material.SetProperty("_ScreenBounds", bounds);. Вам нужно будет рассчитать границы экрана объекта в методе обновления скрипта. Вы можете получить границы, используя Renderer.bounds , и вы можете преобразовать их в пространство экрана, используя Camera.WorldToScreenPoint () . Преобразуйте все углы ограничительной рамки и получите минимальные / максимальные баллы.

Внутри шейдера вы можете вычислить обычные UV-пространства объекта на экранном пространстве, а затем вычесть смещение и поделить на размеры.

Я должен предупредить вас, что есть небольшойзадержка, связанная с отправкой данных в графический процессор, поэтому может возникнуть небольшая задержка при обновлении границ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...