如何在Unity中类似Minecraft的立方地形块的不同面应用不同的法线贴图纹理?

问题描述

我正在Unity中制作一个程序生成的类似于minecraft的体素地形。网格生成和反照率通道纹理完美无瑕;但是,关于它们是否与另一个立方体相邻,我需要对不同的立方体面应用不同的法线贴图纹理。材质仅接受单个法线贴图文件,并且不为法线贴图提供sprite-sheet-editor类型的功能。因此,我不知道如何使用法线贴图文件中的选定切片,就像它们是反照率纹理一样。我找不到有关此问题的任何相关资源。任何帮助将不胜感激。谢谢...

解决方法

首先,我不是这方面的专家,尽管我将基于对Unity部分的有限而又不完全的了解来尝试为您提供帮助。

如果可以存在有限数量的“法线贴图”,我建议像您指出的那样(“精灵图”)并创建包含所有这些法线贴图的单个纹理(有时也称为纹理图集)

下一步(我不确定标准材质明暗器是否适合您的情况)是为法线贴图生成UV /纹理坐标,然后将其与顶点xyz位置一起传递给明暗器。 UV坐标必须针对每个面的每个顶点。它们被指定为法线贴图集的2-D(U,V)偏移量,并且是[0.0,1.0]范围内的浮点值,它们映射到实际法线贴图的完整X和Y坐标。例如,如果您有一个带有4行4列纹理网格的图集,则应使用左上角纹理的面的UV坐标为[(0,0),(0.25,0),(0.25 ,0.25),(0,0.25)]。

这里的困难可能取决于您是否使用UV坐标进行其他纹理贴图(例如在反照率或其他地方)。如果是这种情况,我认为Unity Standard Shader允许使用两组纹理坐标,如果需要更多纹理坐标,则可能必须滚动自己的着色器或在其他地方找到允许更多UV集的Shader资产。这是我对抖动的理解的地方,因为我不能完全确定着色器如何使用这两个UV坐标集,以及是否存在一些有关如何使用这些UV坐标的约定,因为标准着色器支持辅助/细节贴图,这可能意味着您必须与所有非详细地图共享UV0集,例如反照率,法线,高度,遮挡等。