如何在具有放大着色器编辑器的着色器glsl中使用生成器类

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

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

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

和其他...

enter image description here

unity3d shader
1个回答
0
投票

抬头:这可能不是您要查找的内容的方法,因为着色器中的每个像素都需要遍历所有输入点,而每个像素最多只能覆盖一个。这是拥抱着色器并行特性好处的经典案例。 (对我来说,这里的关键字是'random',就像'random looking')。

这里有2个不同的问题:生成圆并对其进行遮罩。我将继续在输入空间之外生成网格(很可能是您的UV坐标,因此我从这里开始假设),方法是将坐标的小数部分缩放为某个值:UV(通常)在0到1之间,因此,如果您想要100个圆,则将坐标乘以10。现在,您将拥有100个UV网格,您可以在其中执行与生成圆所需的操作类似的操作(提示:点乘积一个向量给出平方距离,计算起来便宜得多)。

您需要一些随机性,因此需要在圆心处添加一些偏移。您需要某种随机数(网格中每个单元格唯一)(在ASE中有些我不记得了,或者您可以自己做一个-在网上看起来很多)。为此,您需要将其余的frac()输入为哈希/随机方法的值。您还需要根据圆的半径限制该偏移量,以使其不接触像元的侧面。如果您还想要更多的覆盖范围,则可以覆盖一层以上的圆圈。

第二步是弄清楚是否要显示所有圆,为此,可以使绘图以圆心到提供给着色器的输入坐标的距离为条件(以某个阈值为条件)。 (它本身不一定是'if'条件,它可以将值限制为bg颜色或其他内容)

我对您要在此处执行的操作进行了很多假设,并且如果您对点分布有更强的条件,则可能最好将四边形渲染为渲染纹理,但这是另一个主题:)

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