每面基础上的平铺+纹理图集

时间:2017-11-05 23:29:45

标签: unity3d shader

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

这是我想要在openGl中实现的一个例子:

OpenGl Face-Based-Tiling

看看较大的面是如何平铺的,给人的印象是较小的?纹理来自类似于以下的地图集:

Texture Atlas

我只有统一着色器的基本知识,但是如何用统一的着色器来完成这个呢?

1 个答案:

答案 0 :(得分:0)

为了做到这一点,你需要首先向着色器传递一些信息:面部的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

我实际上没有对它进行测试,但我认为这应该可行。我希望这有帮助!