【问题标题】:How to have a generator class in shader glsl with amplify shader editor如何使用放大着色器编辑器在着色器 glsl 中创建生成器类
【发布时间】:2020-03-29 06:19:30
【问题描述】:

我想创建一个着色器,它可以用许多随机位置的“圆圈”覆盖表面。 圆圈不断增长,直到所有表面都被它们覆盖。 这是我第一次尝试使用放大着色器编辑器。 问题是我不知道如何使这个着色器创建具有随机位置的“point maker”数组。我也想控制圆圈 c#示例:

point_maker = new point_maker[10];
point_maker[1].position = Vector2.one;
point_maker[1].scale = 1;

等等……

【问题讨论】:

    标签: unity3d shader


    【解决方案1】:

    注意:这可能不是您正在寻找的方法,因为着色器中的每个像素都需要遍历所有输入点,而每个像素最多只能被一个像素覆盖.这是一个体现着色器并行特性的经典案例。 (我这里的关键词是“随机”,就像“随机寻找”一样)。

    这里有 2 个明显的问题:生成圆圈和掩盖它们。 我会继续从你的输入空间生成一个网格(很可能是你的 UV 坐标,所以我会从这里假设),通过取坐标的小数部分按某个值缩放:UV(通常)在 0 和 1 之间,所以如果你想要 100 个圆,你可以将坐标乘以 10。你现在有一个由 100 个 UV 组成的网格,你可以在其中执行类似于生成圆的操作(提示:在自身上点积一个向量给出平方距离,计算起来要便宜得多)。

    你想要一些随机性,所以你需要在圆的中心添加一些偏移量。您需要某种随机数(在 ASE 中可能有一些我不记得了,或者自己制作一个 - 您在网上看到的很多),每个网格的单元格都是唯一的。为此,您需要将 frac() 的剩余部分作为值输入到您的散列/随机方法中。您还需要根据圆的半径限制该偏移量,使其不接触单元格的侧面。如果您还想要更多的覆盖范围,您可以覆盖不止一层的圆圈。

    第二步是确定是否要显示这些圆圈,为此,您可以根据从圆圈中心到您提供给着色器的输入坐标的距离,以某个阈值进行绘制. (它本身不一定是“if”条件,它可以将值限制为 bg 颜色或其他东西)

    我在这里做了很多假设,如果你对点分布有更强的条件,你可能最好将四边形渲染到渲染纹理,但这是另一个话题: )

    【讨论】:

    • 坦克!!我现在有很多搜索和测试。但我要测试你最后的想法。将圆形渲染为纹理作为着色器中的遮罩。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多