Здравствуйте, появилась небольшая проблема. После сохранения кода шейдера в Monodevelop или VS я перехожу в окно Unity, в котором происходит загрузка новых, обновленных данных. Обычно по времени это занимало секунды, но теперь после каждого сохранения импорт растягивается на несколько минут. При добавлении всего одной строчки #pragma target 3.0 вообще эта операция длится бесконечно. А при завершении процесса Unity после нового запуска выдается предупреждение : Automatic import for '...Painter.shader' was disabled because the asset importer crashed on it last time. Сам шейдер при запуске нисколько не тормозит. В чем может быть проблема, в количестве операторов или чем-то еще?
Еще есть один вопрос. Написал код, в котором есть переменная float direction. Она используется для рассчета смещение uv для каждой вершины. Если direction задается в шейдере числом, то все корректно работает при любых значениях. Но мне эту переменную нужно вытащить из данных вершины (а именно tangent). Нужное значение хранится в дробной части числа.
float n =IN.tangent.x; float direction = floor((n - floor(n))* 10);
Скрытый текст:
Хотел это сделать функцией frac(n), но нее вообще выдается ошибка Emty string. Так должно быть !?
И вот при такой записи результатом выполнения кода становится розовый цвет текстуры, как-будто произошла ошибка. Может быть в direction в итоге null записывается? Более того, если уйти от всех вычислений и проверить результат таким образом
то результат выдается правильный, судя по полученному цвету. Это значит, что в IN.tangent.x данные записаны, и именно те, которые планировалось записать((
Скрытый текст:
Конечно, я бы не стал писать сюда и продолжил бы искать ошибки сам, если бы уже ранее не сталкивался с нюансами связанными с шейдерами в Unity. Допустим, при сохранении переменной таким образом float x = tangent[3] ее нельзя использовать в качестве индекса tangent[x] и т. д.
Полная версия шейдера. Пока это она не финальная, так что 2 ифа здесь для упрощения кода находятся. Возможно из-за них все проблемы?
//смещение центра этого гекса относительно главного в мировых координатах float2 offset = float2(_HexRadius * rsqrt(3) / (float) 2, _HexRadius + (_HexRadius / (float) 2));
//для direction = 3 и 6 - offset.x *= 2, offset.y = 0; float m = sign(fmod(direction, 3));
offset.y *= m; offset.x *= ((m * -1) + 2);
//вычисление заков в зависимости от направления float sign_x = (direction * 2) - 9; sign_x = sign(sign_x) * -1;
При компиляции шейдеров все циклы и ифы могут пытаться развернуться и выполнится, для гарантии исполнения кода за определенное количество итераций. Подозреваю, что у вас есть цикл с условием, которое не может отресолвится правильно. Ограничивайте итерации сверху строго захардкоденным числом. По дирекшнам вашим... надо код шейдера смотреть.
Здрасте! Ну у меня вроде чтото работает, компилится за пол секунды. с target 3.0 все норм. Просто вначале ругался после вставки. У Вас функция getCoords принимает 2 параметра, а вы обращаетесь к ней с 3мя. Ну это так, к слову. Так что на там счет дирекшиона?
Насчет параметров - это опечатка уже входе вставки кода на форум, поправил) Спасибо, буду пробовать if'ы обойти. Насчет direction'а все не так однозначно)))))
Добавил #pragma target 3.0, убрал все if'ы, исправил использование direction. Теперь текстура отображается корректно. Обновленный код шейдера в первом посте. Все работает, но при добавление строчек с какой-нибудь переменной опять очень долгий импорт. Если просто константу добавляю, то импорт в пару секунд. В чем может быть проблема? А нельзя ли как-нибудь отключить эту процедуру, до того момента, как я напишу шейдер окончательно? Ведь ошибки, после сохранения, показываются в консоле за секунды (что мне и нужно), но если ошибок нет, он очень долго соображает((