unity3d中Transparent/Cutout/Diffuse shader 導致某些android 機型崩潰(比如圖形卡adreno 205)的解決方案


在項目測試中,發現擁有圖形卡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;

      }

  }

}

---------------------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM