Unity 在 Quadtree Shaderforge 上重复 UV 坐标

Unity Repeat UV Coordinates On Quadtree Shaderforge

正如您在图片中看到的,在较大的图块 (n > 1) 上,只要当前的矩形大小,纹理就应该重复。我不知道如何实现!

仅供参考,我正在使用顶点颜色的 alpha 值获取图块纹理 ID。

这里我使用的着色器..

[更新]

感谢您澄清 uv 坐标,不幸的是,这没有回答我的问题。看看下面的图片...

你的着色器没问题;实际上问题出在顶点 UV 上:

So for all rectangles the uv coordinates are as following [0, 0] / [0, rect.height] / [rect.width, 0] / [rect.width, rect.height]. So the uvs are going beyond 1

您的着色器旨在支持标准 UV space,在这种情况下,您应该将 rect.widthrect.height 替换为 1

通过使用大于 1 的 UV 坐标,您实际上是在请求指定纹理之外的纹素。当与纹理图集一起使用时,这意味着您要在指定图块之外请求纹素——在这种情况下,它们恰好是白色的,这就是您在渲染输出中看到的。


使用图集纹理平铺

更新是因为我错过了一个重要的细节:你想要一个平铺 material。

通常,UVs 线性插值:

对于平铺,您基本上需要更多 "sawtooth" 输出:

对于非图集纹理,您可以调整 material scale/wrap 设置并完成。对于图集纹理,这是可能的,但您最终会得到一个不太标准的着色器 and/or 几何体。

"most standard" 解决方案是,如果较大的四边形与较小的四边形位于不同的网格上:

  • 添加一个 float material 参数 uv_scale 或类似的
  • 添加一个 Multiply 节点,按 uv_scale
  • 缩放传入的 UV
  • 将其输出传递到 Frac 节点
  • 将其输出传递到 UV Tile 节点

伪代码大致为:uv = frac(uv * uv_scale)

如果您需要所有四边形都在同一个网格中,您最终需要非标准几何体:

  • 再次更改您的 UV(回到 rect.widthrect.height
  • UV Tile节点前添加一个Frac节点

这是一个更简单的着色器更改,但缺点是其他着色器将不再完全支持您的几何体。

谢谢拉特!

我已经将您的解决方案实施到我的着色器中,现在它完美运行了! 所以对于每个正在寻找这个的人来说,我现在正在使用着色器

干杯,M