【问题标题】:Tiling + Texture Atlas on a Per-Face Basis基于每面的平铺 + 纹理图集
【发布时间】:2017-11-05 23:29:45
【问题描述】:

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

这是我想要在 openGl 中实现的示例:

OpenGl Face-Based-Tiling

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

Texture Atlas

我对Unity中的着色器只有基本的了解,但是我要如何在Unity中编写一个着色器来完成这个呢?

【问题讨论】:

    标签: unity3d shader


    【解决方案1】:

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

    我还没有实际测试过,但我认为这应该可行。我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2018-10-28
      相关资源
      最近更新 更多