HLSL(虚幻引擎4)中的类型转换或数组索引错误



我的HLSL着色器中有以下一段代码,它可以在Windows x64上运行,但在使用UE4部署到Android时无法运行:

// 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

我在UE4Log中没有收到任何错误消息。我也尝试粗略地查看日志猫,但没有发现任何可疑之处。我的输出是一个屏幕,屏幕的左下角是黑色和绿色,黄色和红色在屏幕的右上角插值,我猜测这是着色器在运行时失败的指示。

嗨,

你的代码令人困惑:假设 scale 给你 6.5,那么你的 int 将是 6。

PS:在 hlsl 中的铸造是:

int index = (int) Scale; 

所以你正在访问元素 6 和 7,并用 6.5 来攻击它?这真的是你想要的吗?

也许你想写:

// calcScale() returns a value between 0.0f and 8.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 } // YOU HAVE 9 ELEMENTS! Shouldn't scale be between 0-8???
};
int lowIndex = (int) floor(scale);
int highIndex = (int) ceil(scale);
float factor =  frac(scale); //for 6.5 frac gives you 0.5
OutDeviceColor = lerp(Values[lowIndex], Values[highIndex], factor);
//or better all in one function
OutDeviceColor = lerp(Values[floor(scale)], Values[ceil(scale)], frac(scale));

有一件事要说。尽量避免使用整数。HLSL 可以访问每个带有浮点数的数组或向量。图形设备在处理整数方面不是很好。也许你的编译器无论如何都在优化它,但你不确定。

请记住:一切都针对使用浮点进行了优化。

祝你好运

最新更新