Просто получите масштабирование объекта внутри Cg-шейдера

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

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

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

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

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

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

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

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

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

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

1 ответ

Решение

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

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/

Другие вопросы по тегам