这个着色器代码出了什么问题,它在片段着色器的最后一行的移动设备上崩溃了?

时间:2015-12-02 13:14:48

标签: android unity3d shader

我从统一资产商店获得了这个着色器,它模拟了一些" 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);
                }

1 个答案:

答案 0 :(得分:0)

我终于找出了导致程序崩溃的代码行,这是 当“for(int x = 0; x&lt; interpolators; x ++)”循环计数更大(在我的情况下为24)时,当我将计数器减少到3左右时,它不再崩溃,这解决了我的问题,因为我我的应用程序实际上只需要一个循环。