我是一位经验丰富的本机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