Unity3d:如何在多个对象上拉伸(或共享)着色器

问题描述 投票:0回答:1

我正在修改多维数据集以尝试构建'块类型'的变体(以更加熟悉Unity的功能,着色器,编辑器工具等)。

我有一个通用的多维数据集:

enter image description here

我想添加一个材质/着色器..我已经完成了(那里没问题):

enter image description here

(出于我的目的)看起来只有一个街区,但当我完全粘贴它们时,我不喜欢这种效果;您可以看到各个框,并且着色器(在静态图像中看不到)实际上是动画水,因此在设置动画时看起来很丑。

(差/不想要的)enter image description here

我正在尝试拉伸或在所有选定块之间共享着色器/材质。参见下面的示例(在这种情况下,我采用了单个块并将其拉伸,但这与拥有单个块的精神不符,因此也不符合我的意愿)。

(更好/更希望)

enter image description here

我以为以下内容可能会有所帮助,但它们似乎都过于复杂(又名我认为我做错了)

  1. 具有单个块,但在它们上拉伸一个平面,然后应用材质。
  2. 我发现了以编程方式连接网格的示例,然后将材质/着色器应用于单个对象。
  3. 取一个块并将其拉伸到所需的尺寸。
  4. 也许(不确定我是否可以),但是要在上面涂上水的材料并将其用作蒙版,以仅显示这些蒙版的水?不确定如何运作...

最后,我希望有以下内容:

  1. 单个块(因此我可以与他们互动。
  2. 着色器动画/颜色在共享/连接的块之间共享。
  3. 它并不总是2x3的网格...它可能是对角线的,或包含连接块的奇特形状...

(全部处于EDITOR模式)。

关于如何处理此问题的任何想法?

unity3d shader unity-editor
1个回答
1
投票

您可以尝试搜索的短语是“从世界空间转换为uv空间”,“转换uv坐标”,“ uv数学”。 UV是着色器从中采样的纹理中坐标的名称,如果采用现有的着色器代码,则可以通过更改其使用的UV来做一些有趣的事情。其中之一就是让您“拉伸”它。

在您的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

My answer对于不同的问题,使用了与通过将像素的世界位置与一系列世界位置进行比较以得到UV相似的逻辑。相关的着色器代码为:

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

[另一种选择是仅查看世界位置,而完全不考虑uv的“拐角”应该在哪里。一种称为“三面映射”的方法可能会引导您找到执行此操作的解决方案]

© www.soinside.com 2019 - 2024. All rights reserved.