在项目测试中,发现拥有图形卡adreno 205的android手机,一旦进入有"Transparent/Cutout/Diffuse" shader的场景,应用就挂了。
在ios手机和其他android手机上倒是运行正常。找到Transparent/Cutout/Diffuse shader研究发现主要是alphatest造成的。
以下是Transparent/Cutout/Diffuse的源码。
--------------------------------------------------------------------------------------------
Shader "Transparent/Cutout/Diffuse" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 }
SubShader { Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} LOD 200 CGPROGRAM #pragma surface surf Lambert alphatest:_Cutoff
sampler2D _MainTex; fixed4 _Color;
struct Input { float2 uv_MainTex; };
void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG }
Fallback "Transparent/Cutout/VertexLit" }
-------------------------------------------------------------------------------------
在源码中,注意到:#pragma surface surf Lambert alphatest:_Cutoff这行,如果改成:#pragma surface surf Lambert
则可以运行正常,但是需要的透明效果就没有了。这样就断了从SHADER修改代码解决这个问题的路,只能使用效果基本类似的SHADER
代替这个效果好的的Transparent/Cutout/Diffuse SHADER. 这样做有一个问题出现了,就是本来这个SHADER除了adreno 205这类机型不可以用,
大部分都是可以使用的,换了SHADER后必然造成大部分的可以使用这个Transparent/Cutout/Diffuse SHADER的场景降低了显示效果。
怎么办呢?其实很简单,就是在要使用的场景模型上绑定一个脚本,它可以根据机型选择不同的SHADER,这样就基本满足了要求。
脚本如下:
-------------------------------------------------------------------------------------
using UnityEngine;
using Sytem.Collections;
public class ShaderChange: MonoBehaviour{
public Shader chgShader;
void Start(){
if(SystemInfo.graphicsDeviceName.Equals("adreno 205")){
renderer.material.shader = chgShader;
}
}
}
---------------------------------------------------------------------
|