Просто получите масштабирование объекта внутри Cg-шейдера - PullRequest
0 голосов
/ 13 января 2019

Скажем, у вас есть тривиальный шейдер Unity. Он вообще не использует никаких текстур. Он просто захватывает позицию ..

void vert (inout appdata_full v, out Input o) 
{
    UNITY_INITIALIZE_OUTPUT(Input,o);
    o.localPos = v.vertex.xyz;
}

, а затем рисует квадрат ..

enter image description here

квадрат в примере был растянут примерно на 3: 1 с помощью преобразования.

Если бы в шейдере мы просто знали масштабирование (или просто отношения), мы могли бы очень легко нарисовать «квадратные квадраты»

enter image description here

Это, очевидно, обычная повседневная техника для таких вещей, как рекламный щит, 2D-изображения и фон и т. Д.

В текущем единстве (2018), как, черт возьми, вы просто получаете текущее масштабирование объекта, в Cg?

Это одна из тех сумасшедших вещей Unity, которая (1) совершенно недокументирована (2) где единственная доступная информация о ней - это 13 лет , я имею в виду, что некоторые из вовлеченных людей могут быть умершим (3), он сильно изменился в разных версиях Unity, поэтому часто обсуждение этого вопроса совершенно неверно. Вздох.

Как это сделать? Вы можете?

В настоящее время у меня просто тривиальный сценарий передачи значения, что нормально, но немного дрянно.

1 Ответ

0 голосов
/ 14 января 2019

Масштаб преобразования запекается в мировой матрице. Если ваш объект не вращается, вы можете получить его напрямую с небольшим движением, но, скорее всего, вы захотите сделать что-то вроде этого:

half3 ObjectScale() {
return half3(
    length(unity_ObjectToWorld._m00_m10_m20),
    length(unity_ObjectToWorld._m01_m11_m21),
    length(unity_ObjectToWorld._m02_m12_m22)
);

}

Heads-Up: эта реализация зависит от API, вам может понадобиться использовать DEFINE для решения этой проблемы в DX / OGL, поскольку формат матрицы отличается (порядок строк и столбцов).

есть также другой способ доступа к компонентам матриц: https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-per-component-math

как примеры в этой теме https://forum.unity.com/threads/can-i-get-the-scale-in-the-transform-of-the-object-i-attach-a-shader-to-if-so-how.418345/

...