假设有些值p(每帧计算)在对象表面上连续变化。 p的值确定表面上某些图案的密度。例如,在一个只有两种可能密度的情况下,如果p < 0.3是高密度,则它是低密度。

我想到了一个简单的高级解决方案:创建两个纹理,每个纹理不同密度,并根据来自适当样品的p的值。但是,高密度和低密度之间的边界存在问题。

这里有一个示例来说明此问题(请注意,我的问题并不限于此示例点图案。我描述了这些图案我稍后再讨论):



这是低和高之间的阈值(显示在高密度纹理上,但这无关紧要。)如果在此线以下,则意味着应该对高密度纹理进行采样。



最后,这是期望的结果与使用此结果实际发生的结果之间的比较。方法:



问题在于,当仅高密度的圆穿过线时,当p指示要采样的低密度纹理时,它将被忽略。 ,导致圆环被截断。我不知道如何解决此问题,因为p每帧都不同,所以我不能只是“烘烤”两个密度之间的边界。通过从下部纹理创建高密度纹理很容易防止出现反向问题(即,如果在低密度纹理上有圆圈,请确保在高密度纹理上有圆圈。)

我很想知道是否有人可以改善我的解决方案,甚至完全可以采用另一种方法。这里的限制是p是按帧实时计算的。另一个约束与图案纹理有关:图案为黑白,其中黑色为图案,白色为背景(如示例中的圆圈)。该图案不仅可以是重复的相同形状,还可以是白色背景上任意黑色形状的任何排列。 (也许模式是单词的错误选择。)

我对这一领域的研究并不熟悉,所以我不确定要搜索哪个关键词,所以我什至希望有人可以为我指明正确的方向。

评论

您的实际纹理也是白色的黑点吗?如果是这样,您可能可以按程序生成纹理,例如半径变化的Poisson圆盘采样。否则,如果您的纹理实际上更连续,则可以选择混合(但是对于像您的示例那样的清晰纹理,效果不佳)。因此,如果您可以弄清楚实际的图案/纹理是什么样的,则可能有助于获得更多有用的答案。

后期过程?类似于边缘检测的一种形式:写出到最近点中心的距离,然后在屏幕空间中,搜索每个像素点大小附近的任何(接近)零值。这会产生屏幕空间点,因此您必须编写并弄乱UV导数才能回到纹理空间...请注意,您仍然遇到连续性问题-随着p高/低边界在整个表面上移动,会出现点然后消失如果p可以是连续的(软边界),则可以沿边界缩小/增长点...

另一种选择是查看Wang拼贴。简介,瓷砖遗传学,GPU宝石

您是否看过纹理轰炸? http.developer.nvidia.com/GPUGems/gpugems_ch20.html

您能否给出所需覆盖的形状/图案的范围以及该方法有多少灵活性的想法? @DanielMGessel关于更改圆半径而不是其密度的建议可能使事情变得更简单且动画效果更平滑,但尚不清楚您的方法受到多少限制。

#1 楼

为了确保图案形状始终完全存在或不存在,永不中断,必须确保对形状内的所有纹理像素使用相同的p值。在您的圆示例中,给定圆中的所有纹理像素都需要对p达成一致。

我假设您有某种方法可以评估表面上给定点的p(是否向上看)从纹理或从某些函数计算得出)。然后,要确保一组纹理像素都具有相同的p值,一种方法是确保它们都从同一点向上查找。花纹纹理。例如,您可以让红色和绿色通道存储要评估p的UV坐标,蓝色通道存储要打开该图案元素的阈值,而alpha通道要存储要显示的图案的抗锯齿灰度。如果需要,UV +阈值数据也可以位于单独的辅助纹理中。

要生成此UV +阈值纹理,可以从输入图案纹理开始,以编程方式找到连接的组件(例如,通过搜索用于黑色像素和泛洪)。将每个组件中所有纹理像素的评估点设置为组件中心的UV,并为其生成随机阈值。然后,在渲染时,使用像素着色器首先对纹理进行采样,然后在给定的评估点查找p并将其与给定的阈值进行比较。

这样,每个图案形状都会看到一个均匀的p值和阈值,并将完全打开或关闭。随着p的增加,更多形状将通过其阈值并出现,从而给人以不断变化的密度印象。

评论


$ \ begingroup $
我真的很喜欢这个主意,我必须尝试一下。这是很合理的。谢谢!
$ \ endgroup $
–瑞安
16-3-12的2:49

#2 楼

另一思路是沿着这些思路。如果您在平面上定义了一个统一点集,并且具有从平面到目标表面的映射功能,则表面上的密度函数就是区域从平面表面到目标的映射方式。因此,保留区域的地图将在目标上产生统一的点。