Unity3d 瓷砖+;基于每个面的纹理图谱

Unity3d 瓷砖+;基于每个面的纹理图谱,unity3d,shader,Unity3d,Shader,我最近在做一个使用贪婪网格的体素游戏。面将在1*1到64*64单位之间变化。对于游戏中的平坦区域,将多个较小的地形平铺组合成具有平铺纹理的较大地形平铺更有意义,但这给我的精灵地图集带来了一个问题。每个uv都有一个对地图集上一个点的引用,但对于较大的贪婪面,纹理会被拉伸。我希望uv在每个面上平铺正确的次数,以产生相同的结果,就像较大的面是一堆较小的面一样,只是没有额外的几何体 以下是我希望在openGl中实现的一个示例: 看到大的面是如何平铺的给人留下小的印象了吗?纹理来自类似于以下内容的图集:

我最近在做一个使用贪婪网格的体素游戏。面将在1*1到64*64单位之间变化。对于游戏中的平坦区域,将多个较小的地形平铺组合成具有平铺纹理的较大地形平铺更有意义,但这给我的精灵地图集带来了一个问题。每个uv都有一个对地图集上一个点的引用,但对于较大的贪婪面,纹理会被拉伸。我希望uv在每个面上平铺正确的次数,以产生相同的结果,就像较大的面是一堆较小的面一样,只是没有额外的几何体

以下是我希望在openGl中实现的一个示例:

看到大的面是如何平铺的给人留下小的印象了吗?纹理来自类似于以下内容的图集:


我只知道unity中的着色器的基本知识,但如何编写unity中的着色器来实现这一点?

为了做到这一点,您需要首先向着色器传递一些信息:面的x和y维度(以瓷砖为单位)以及瓷砖左下角和右上角的uv坐标。然后,可以使用以下方程式计算uv坐标,假设面的uv值(inputUV)范围从精灵的左下角到右上角:

float2 newUV = (inputUV - llCorner)/(urCorner - llCorner); //converts from input uv to values between (0.0, 0.0) and (1.0, 1.0)
newUV.x = newUV.x * xDim % 1; //makes the newUV coordinates repeat xDim times on the x axis
newUV.y = newUV.y * yDim % 1; //makes the newUV coordinates repeat yDim times on the y axis
newUV = newUV*(urCorner - llCorner) + llCorner; //converts values between (0.0, 0.0) and (1.0, 1.0) to values between the lower left corner and the upper right corner
我还没有实际测试过,但我认为应该可以。我希望这有帮助