У меня есть следующий фрагмент кода в моей HLSL шейдер, который работает на Windows x64, но не запускается при развертывании на Android с помощью UE4:тип литья или массив индексации ошибка в HLSL (Unreal Engine 4)
// calcScale() returns a value between 0.0f and 7.0f, inclusive
float Scale = calcScale();
const float3 Values[] =
{
{ 0.0f, 0.0f, 0.0f },
{ 0.0f, 1.0f, 1.0f },
{ 0.0f, 0.0f, 1.0f },
{ 0.0f, 1.0f, 1.0f },
{ 1.0f, 1.0f, 0.0f },
{ 1.0f, 1.0f, 0.0f },
{ 1.0f, 0.0f, 1.0f },
{ 0.0f, 1.0f, 1.0f },
{ 1.0f, 1.0f, 1.0f }
};
int index = int(Scale);
OutDeviceColor = lerp(Values[index], Values[index + 1], Scale);
Если я заменить последнюю строку с литералов, он работает:
OutDeviceColor = lerp(Values[0], Values[1], Scale); //works
Я даже попытался установить:
int index = 0; // does not help
I не получайте сообщений об ошибках в UE4Log. Я тоже попробовал беглый взгляд на logcat, но не нашел ничего подозрительного. Мой выход - это экран с нижней левой частью экрана, черный и зеленый, желтый и красный, интерполированные в верхней правой части экрана, что является тем, что я предполагаю, является признаком отсутствия шейдера во время выполнения.
AFAIK вы можете использовать переменную с плавающей точкой 'Scale' непосредственно для доступа массива, без преобразования его в междунар. Вы пробовали это? Я просмотрел документацию HLSL, но, к сожалению, не нашел ссылки. Но я уверен, что в соответствии с прежней ссылкой DX9 HLSL был описан такой вариант. – Gnietschow
Я думаю, что это было бы сильно зависящим от компилятора, если бы оно сработало. Чтобы быть в безопасности, было бы предпочтительнее использовать его для int или uint, прежде чем использовать его в качестве индекса. – shaveenk