微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# 后期函数评估或其他

如何解决C# 后期函数评估或其他

我正在编写一个工具,通过图形用户界面程序化地生成风景。您可以在那里定义和连接不同的“生成”节点。结果是生成的“高度场”的 3d 表示。节点可以例如是一个“柏林噪声”节点,它为景观高度生成随机”噪声。计算是“一个一个”执行的。从源代码到实际的“3d 几何生成节点”。

我现在在做什么:

每个节点都执行一些计算。某些节点没有连接任何输入,因此它们是“源”节点。每个节点(源节点与否)都会生成一个输出,此时它只是一个表示生成值的 float[]。

输出的每个 Array 元素表示景观中相应位置的高度,并作为以下连接节点的输入。 value[0] 表示 min(x)/min(y) 处的高度,最后一项 value[dim * dim - 1] 表示横向位置 max(x)/max(y) 处的高度。

现在我想实现一个“Warp”节点。它的目的是通过一些随机值(再次通过一些噪声值 - 如柏林噪声)来扭曲输入。这意味着,我的输出项值 [0] 可以从输入项值 [warp.Y * dim + warp.X] 映射/扭曲。

这带来了两个问题:

  1. 我需要访问位置不是整数的值(噪声值的范围通常为 [-1,1] * somefactor)。可以通过插值对非整数位置进行评估 - 这不是“真正的”问题,只是性能不高。
  2. 我需要访问坐标“超出”边界的值,即负 X 和 Y 坐标,或大于景观“暗淡”的坐标值。

为了避免第二个问题,我目前“反射”了边界上的坐标。这意味着 X 值为 -3.45 的坐标将反映为 X = +3.45 的坐标。这不是我真正想要的结果。最好在计算开始时直接生成所需的(扭曲的)值,方法是在我直接创建噪声值时扭曲坐标。

理论上这个问题很容易解决: 当我为景观生成噪点时,我会在评估噪点之前立即扭曲所有 x/y 坐标。

问题在于应用程序的迭代性质: 起初我想评估节点 1,之后我想评估节点 2.... 等等(也许我应该改变这种方法?)

我想通过在每一侧(在最小和最大 x/y 处)额外生成一个“缓冲区”区域来解决这个问题,这样我就可以在需要时访问那些额外生成的高度值(我不需要)不过我真的很喜欢这个主意)。

另一种可能性是前面提到的“迟到或懒惰”的评估。 例如,我们的想法是用 Func 替换提到的 float[] 类型的结果。我只是不知道这是否是一个好的解决方案。当我想到这种方法时,我想到了一个问题:我想稍后将用于节点计算的当前 C# 代码移植到 Cuda - 所以我认为使用 Func 将是不可能的。

由于我稍后使用 OpenTK 来显示结果,因此为计算创建着色器并仅对节点结果使用纹理可能是更好的方法(这与第一个想法相同)。

我真的不知道最后什么是最好的。任何建议都会有所帮助,谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。