我是一位經驗豐富的本機iOS開發人員,通過Unity第一次進入Android系統。我正在嘗試設置自定義着色器,但我在法線貼圖上遇到了一些麻煩。我已經讓他們在我的電腦上的Unity模擬器中完美工作,但是當我構建到實際設備(Samsung Galaxy S8 +)時,Normal地圖根本無法工作。Unity正常地圖在Android設備上無法正常工作
我使用火星作爲我的測試用例。下面是我的計算機上仿真運行模式:
下面是從我的設備的屏幕截圖,運行完全相同的代碼。在Android
我所做的研究很多,顯然使用法線貼圖與團結不是一件容易的事情。有很多人都在問這個問題,但是我發現幾乎所有的答案都說要覆蓋紋理導入設置,並強制它成爲「Truecolor」,根據,它似乎是「RGBA 32位」 。但這並沒有幫助我。
另一個線程建議將Asino等級降爲零,另一個線程建議關閉Mip Maps。我不知道這些是什麼,但都沒有幫助。
這裏是我的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上工作?
我的法線貼圖在我的遊戲怪物2中完美地運行在android上。我甚至沒有寫自己的着色器,使用默認的。無論如何,你有沒有檢查過你的Android質量設置?編輯 - >項目設置 - >質量 – Lestat
@Lestat A-HA!就是這樣!我以前從未聽說過質量設置,但顯然它默認設置爲「最快」,其中不包括陰影。將其切換到更高質量的設置會立即解決問題。如果您將其添加爲答案,我會接受它。謝謝! – Nerrolken