Unity3d:如何跨多个 objects 拉伸(或共享)着色器

Unity3d: How to stretch (or share) a shader across multiple objects

我正在尝试构建 'block types' 的变体(为了更加熟悉 Unity 的功能、着色器、编辑器工具等)。

我有一个通用立方体:

我想添加一个 material/shader.. 我已经完成了(没问题):

当它只是一个方块时(为了我的目的)看起来很好,但是当我把它们全部粘在一起时,我不喜欢这种效果;你可以看到单独的盒子和着色器(你在静止图像中看不到)实际上是动画水,所以当它动画时它看起来......非常丑陋。

(Bad/undesired)

我正在尝试在所有选定的块中拉伸或共享 shader/material。请参见下面的示例(在这种情况下,我采用了一个 SINGLE 块并将其拉伸,但这不符合拥有单个块的精神,所以也不是我想要的)。

(需要better/more)

我认为以下内容可能会有所帮助,但它们似乎都过于复杂(也就是说我认为我的做法不正确)

  1. 有单独的块,但在它们之间拉伸一个平面,然后应用 material。
  2. 我找到了以编程方式连接网格的示例,然后将 material/shader 应用于单个 object。
  3. 取一个块并将其拉伸到所需的尺寸。
  4. 也许(不确定我是否可以),但是有一个应用了水的平面 material 并使用方块作为遮罩只为这些方块显示水?不确定它是如何工作的...

最后我希望有以下几点:

  1. 独立方块(这样我就可以和他们互动了。
  2. 着色器 animations/colors 在 shared/connected 个块之间共享。
  3. 它不会总是 2x3 的网格...它可能是对角线的,或者包含奇怪形状的连接块...

(这都是编辑器模式)。

有什么想法可以解决这个问题吗?

您可以尝试搜索的短语有 "converting from world space to uv space"、"transforming uv coordinates"、"uv math"。 UV 是着色器从中采样的纹理坐标的名称,如果您使用现有的着色器代码,您可以通过更改它使用的 UV 来做一些有趣的事情。其中之一就是让你 "stretch" 它。

在您的 2x3 立方体示例中,您可以告诉每个立方体将其 U 值视为从 0 到 0.5 或 0.5 到 1,并将 V 视为从 0 到 0.33 或 0.33 到 0.67 或 0.67 到 1,具体取决于位置它不是每个从 0 到 1 的。您可以通过在着色器上设置 属性 来告诉它从哪里开始 uv (a) 以及在哪里结束它的 uv (b), 并且你从 (0,0) - (1,1) 到 a - b

到另一个问题使用一些类似的逻辑,通过比较像素的世界位置与一系列世界位置来获得 UV。相关着色器代码为:

fixed4 colorizedMapUV = (IN.worldPos.xz-_WorldSpaceRange.xy) 
        / (_WorldSpaceRange.zw-_WorldSpaceRange.xy); 

另一种选择是只看世界位置,而完全忽略 uv "corners" 应该在哪里的概念。称为 "triplanar mapping" 的方法可能会引导您找到执行此操作的解决方案