2017-07-28 165 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

相关问题