【问题标题】:Unity3d: How to stretch (or share) a shader across multiple objectsUnity3d:如何跨多个对象拉伸(或共享)着色器
【发布时间】:2020-03-20 20:35:37
【问题描述】:

我正在尝试构建“块类型”变体的立方体(以努力更熟悉 Unity 的功能、着色器、编辑器工具等)。

我有一个通用立方体:

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

当它只有一个街区时,它看起来足够好(就我的目的而言),但当我把它们全部粘在一起时,我不喜欢这种效果;您可以看到各个框,并且着色器(您在静止图像中看不到)实际上是动画水,所以当它制作动画时,它看起来......非常难看。

(不良/不受欢迎)

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

(更好/更需要)

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

  1. 拥有单独的块,但在它们上拉伸一个平面,然后应用材料。
  2. 我找到了以编程方式连接网格的示例,然后将材质/着色器应用于单个对象。
  3. 取出一个块并将其拉伸到所需的尺寸。
  4. 也许可以(不确定我是否可以),但是有一架飞机,上面涂有水材料,并使用方块作为遮罩,只显示这些方块的水吗?不知道它是如何工作的......

最后我希望有以下几点:

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

(这都是在 EDITOR 模式下)。

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

【问题讨论】:

  • 您可以重新编码片段着色器或表面着色器,以便能够将其表面视为其大小的一小部分,但具体如何做到这一点取决于特定的着色器。
  • 有趣...所以每个“立方体”都会获得整体着色器的“一部分”,但随后其他立方体将占据着色器的(单独)部分,使其看起来像是一种材质/着色器,但它真的是跨所有块的 X*Y 独特材质/着色器吗?我正在使用带有 PBR 的新通用着色器 (LWRP)。对着色器来说还是很新……鉴于你的建议+我正在使用什么,我应该用谷歌/查找什么?
  • 太棒了。谢谢你。我可以投票给你的 cmets,我会仔细研究它,但如果你想发布答案,我 +1 表示感谢你让我走上了正确的道路。
  • 我在下面重写了我的 cmets,修正了一些错误并包括更好的格式。乐于助人。

标签: unity3d shader unity-editor


【解决方案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 的“角落”应该在哪里的概念。一种称为“三平面映射”的方法可能会引导您找到执行此操作的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多