-
Notifications
You must be signed in to change notification settings - Fork 241
Wang Tiles for Image and Texture Generation
在图形学中经常有一种需求,我们需要一些非常大的纹理贴图,而这些贴图内部很相似,比如一面砖墙的贴图。我们可能采取的方法就是用一块小的贴图然后一直重复的贴满这个物体。但是这样看起来效果会非常差。因此我们可以采用Wang Tiles贴图的方式来用几块小的贴图来随机生成不重复的大贴图。
wang tiles的思想非常的有意思,他是把两块小贴图边缘可以连接在一起的就涂成同一种颜色。
首先要讲所有的小纹理读入内存,在OpenGL中我们可以存成TextureArray的方式,如此一来我们就把纹理简化为了数组。
因为随机生成大贴图最大的问题就是边缘能不能无缝连接的问题。如此一来的我们就只需要判断边缘颜色是否一样即可(这个颜色我们可以用一个数字替代)。
生成步骤(按照从下至上,从左至右的顺序生成,和UV坐标一样后面有用。)我们可以提前在CPU中计算一块大纹理中小块纹理的位置。因此我们只需要最后传给GPU一个二维数组即可。
-
先随机生成(0,0)位置的贴图ID。
-
然后再生成第1行的贴图ID,生成的过程中我们只需要判断当前位置的左边与上一个位置的右边是否颜色一样即可。
-
再生成第i行的第一块贴图ID,只需要判断当前位置下边与上一行的上边颜色是否一致即可
-
再生成第i行剩余的贴图ID,需要判断当前位置下边与上一行的上边颜色是否一致以及当前位置的左边与上一个位置的右边是否颜色一样
-
然后重复上面两部,直到完成所有行列的计算。
然后我们可以将这个二维数组传入GPU,再根据UV坐标按照下面公式计算出当前UV坐标所处的第几块。
如此一来我们就可以从上面计算的二维数组中读取当前贴图ID T。然后再根据下面公式计算出现在应该进行对T纹理的纹理采样坐标。
本文只讲了如果用Wang Tiles来生成纹理贴图,而没有讲如何生成Wang Tiles。我们将在第二部分讲解如何生成Wang Tiles.