我从统一资产商店获得了这个着色器,它模拟了一些" force field"效果,它在PC上运行正常,但在我的Android设备上崩溃。该问题通常发生在片段着色器代码的最后几行:
...
...
fixed3 final = outterMask * _OuterTint.a//outterMask is a fixed3 and
//_OuterTint is a fixed4
return fixed4(final,1.0);
我做了一些检查,如果我将最后一行替换为
return fixed4(1.0,1.0,1.0,1.0);
它不再在移动设备上崩溃。另外,如果我将第二行替换为最后一行
fixed3 final = _OuterTint.a;
它也可以正常工作。
因此,似乎返回计算出的final
值会导致崩溃,而上面的所有代码都没有,现在我只是不明白哪种值会出错。
通过返回片段着色器中的哪种值可能导致设备崩溃?我需要知道这个以进行进一步检查,我试图简单地钳制并饱和此值,但它无论如何都崩溃了。
完整片段着色器代码:
/// FRAGMENT
fixed4 frag (v2f i) : COLOR
{
int interpolators = 24;
fixed4 pos[24];
fixed power[24];
fixed3 innerMask = 0.0;
fixed3 outterMask = 0.0;
pos[0] = _Pos_0;
pos[1] = _Pos_1;
pos[2] = _Pos_2;
pos[3] = _Pos_3;
pos[4] = _Pos_4;
pos[5] = _Pos_5;
pos[6] = _Pos_6;
pos[7] = _Pos_7;
pos[8] = _Pos_8;
pos[9] = _Pos_9;
pos[10] = _Pos_10;
pos[11] = _Pos_11;
pos[12] = _Pos_12;
pos[13] = _Pos_13;
pos[14] = _Pos_14;
pos[15] = _Pos_15;
pos[16] = _Pos_16;
pos[17] = _Pos_17;
pos[18] = _Pos_18;
pos[19] = _Pos_19;
pos[20] = _Pos_20;
pos[21] = _Pos_21;
pos[22] = _Pos_22;
pos[23] = _Pos_23;
power[0] = _Pow_0;
power[1] = _Pow_1;
power[2] = _Pow_2;
power[3] = _Pow_3;
power[4] = _Pow_4;
power[5] = _Pow_5;
power[6] = _Pow_6;
power[7] = _Pow_7;
power[8] = _Pow_8;
power[9] = _Pow_9;
power[10] = _Pow_10;
power[11] = _Pow_11;
power[12] = _Pow_12;
power[13] = _Pow_13;
power[14] = _Pow_14;
power[15] = _Pow_15;
power[16] = _Pow_16;
power[17] = _Pow_17;
power[18] = _Pow_18;
power[19] = _Pow_19;
power[20] = _Pow_20;
power[21] = _Pow_21;
power[22] = _Pow_22;
power[23] = _Pow_23;
for(int x = 0; x < interpolators; x++)
{
fixed dist = distance(pos[x].xyz + i.normal * _Offset, i.oPos.xyz);
innerMask += pow(saturate(1 - dist * ((power[x] + _InnterOffset) + (1 - pos[x].w) * 2)), _InnerPow) * pos[x].w;
outterMask += pow(saturate(1 - dist * (_OutterOffset - (1 - pos[x].w) * 2)), _OutterPow) * pos[x].w;
}
fixed field_Tex = pow(tex2D(_FieldTex, uvPanner(i.uv, _FieldPanSpeed, _FieldPanSpeed)), 2.2).r;
fixed field_Tex_inv = pow(tex2D(_FieldTex, uvPanner(i.uv, -_FieldPanSpeed, -_FieldPanSpeed)), 2.2).r;
fixed3 fieldColor = lerp(_OuterTint, _InnerTint, field_Tex.r).rgb;
fixed sparksMask = saturate(field_Tex * field_Tex_inv).x;
fixed3 sparks = saturate(sparksMask * fieldColor) * _FieldSparks;
outterMask = saturate(outterMask * _OuterTint.rgb);
innerMask = saturate(innerMask * _InnerTint.rgb);
fixed3 final = outterMask * _OuterTint.a * 10 + innerMask * _InnerTint.a * 10;
final += field_Tex * fieldColor * outterMask * _FieldBG;
final += sparks * outterMask * 10;
return fixed4(final, 1.0);
}
答案 0 :(得分:0)
我终于找出了导致程序崩溃的代码行,这是 当“for(int x = 0; x&lt; interpolators; x ++)”循环计数更大(在我的情况下为24)时,当我将计数器减少到3左右时,它不再崩溃,这解决了我的问题,因为我我的应用程序实际上只需要一个循环。