2017-07-28 226 views
2

我是一位經驗豐富的本機iOS開發人員,通過Unity第一次進入Android系統。我正在嘗試設置自定義着色器,但我在法線貼圖上遇到了一些麻煩。我已經讓他們在我的電腦上的Unity模擬器中完美工作,但是當我構建到實際設備(Samsung Galaxy S8 +)時,Normal地圖根本無法工作。Unity正常地圖在Android設備上無法正常工作

我使用火星作爲我的測試用例。下面是我的計算機上仿真運行模式:

Computer version

下面是從我的設備的屏幕截圖,運行完全相同的代碼。在Android

Android device version

我所做的研究很多,顯然使用法線貼圖與團結不是一件容易的事情。有很多人都在問這個問題,但是我發現幾乎所有的答案都說要覆蓋紋理導入設置,並強制它成爲「Truecolor」,根據​​,它似乎是「RGBA 32位」 。但這並沒有幫助我。

另一個線程建議將Asino等級降爲零,另一個線程建議關閉Mip Maps。我不知道這些是什麼,但都沒有幫助。

Texture Import Settings

這裏是我的shader代碼,簡化但包含於法線貼圖的所有引用:

void surf (Input IN, inout SurfaceOutputStandard o) { 
     half4 d = tex2D (_MainTex , IN.uv_MainTex); 
     half4 n = tex2D (_BumpMap , IN.uv_BumpMap); 

     o.Albedo = d.rgb; 
     o.Normal = UnpackNormal(n); 
     o.Metallic = 0.0; 
     o.Smoothness = 0.0; 
    } 

我已經看到了一些線程表明在着色器代碼爲「UnpackNormal)(」替代函數,這表明它可能並不是通常在Android或移動設備上執行的任務,但是沒有任何建議的替代品可以改變或改善任何事情:正常的地圖在模擬器中繼續工作,但不在設備上。

我甚至嘗試從灰度高度圖編程製作我自己的法線貼圖,試圖繞過任何導入設置,我可能做錯了。這裏是我使用的代碼,它再次在模擬器中工作,但不在設備上。

public Texture2D NormalMap(Texture2D source, float strength = 10.0f) { 
    Texture2D normalTexture; 
    float xLeft; 
    float xRight; 
    float yUp; 
    float yDown; 
    float yDelta; 
    float xDelta; 

    normalTexture = new Texture2D (source.width, source.height, TextureFormat.RGBA32, false, true); 

    for (int y=0; y<source.height; y++) { 
     for (int x=0; x<source.width; x++) { 
      xLeft = source.GetPixel (x - 1, y).grayscale * strength; 
      xRight = source.GetPixel (x + 1, y).grayscale * strength; 
      yUp = source.GetPixel (x, y - 1).grayscale * strength; 
      yDown = source.GetPixel (x, y + 1).grayscale * strength; 
      xDelta = ((xLeft - xRight) + 1) * 0.5f; 
      yDelta = ((yUp - yDown) + 1) * 0.5f; 
      normalTexture.SetPixel(x,y,new Color(xDelta,yDelta,1.0f,yDelta)); 
     } 
    } 
    normalTexture.Apply(); 

    return normalTexture; 
} 

最後,在生成設置,我已經得到了平臺設置爲Android和我已經使用紋理壓縮設置爲兩個「不越權」和「ETC(默認)」試了一下。前者是原始設置,後者似乎是Unity的名稱和文檔中的建議。

我確定只有一些標誌我沒有檢查或者一些開關沒有翻動,但是我不能爲了我的生活找出我在這裏做錯了什麼,或者爲什麼會出現這種情況在模擬器和設備之間是如此頑固的區別。

任何人都可以幫助一個Unity新手出來,並告訴我這些該死的法師地圖應該如何在Android上工作?

+1

我的法線貼圖在我的遊戲怪物2中完美地運行在android上。我甚至沒有寫自己的着色器,使用默認的。無論如何,你有沒有檢查過你的Android質量設置?編輯 - >項目設置 - >質量 – Lestat

+0

@Lestat A-HA!就是這樣!我以前從未聽說過質量設置,但顯然它默認設置爲「最快」,其中不包括陰影。將其切換到更高質量的設置會立即解決問題。如果您將其添加爲答案,我會接受它。謝謝! – Nerrolken

回答

3

檢查下:

編輯 - >項目設置 - >質量

的Android通常被設置爲最快。

+0

有趣。我還沒有遇到這個問題。 – Programmer

相關問題