限带程序纹理

2020-08-27 22:06:33

运行时程序纹理(未烘焙到位图中)占用的内存很小,并且可以在运行时自定义,这些都是很棒的功能。然而,在渲染过程中控制锯齿可能很困难,除非有一些中间的程序到位图的缓存来促进预过滤(例如,就像Renderman的RtxPlugin中那样)。在没有这样的系统的情况下,人们总是可以有选择地对纹理进行过采样,作为过滤的数值近似,这在一定程度上减少了混叠。然而,一些过程模式可以仅仅根据其构造的简单性质进行分析过滤。这意味着可以呈现一些特殊的过程函数,而不会产生别名,至少在隔离状态下是这样。现在,函数合成的积分一般不是积分的合成,也就是说,过滤后的复杂着色网络与由过滤元素组成的非过滤网络是不同的,这就是说,函数合成的积分通常不是积分的合成,也就是说,过滤后的复杂着色网络与由过滤元素组成的非过滤网络是不同的。然而,在实践中,我们可以对这些模式逐个进行分析过滤,并且仍然可以从网络中获得合理的带宽限制结果(可能略有过度模糊)。实际上,虽然带宽限制并不能替代适当的滤波,但它是解决混叠问题的有效替代方法。任何做程序内容的人都在某个点上实现了带宽限制,或者以几何或着色/纹理静态LOD的形式,或者通过直接操纵程序细节的构造。这项技术和计算机图形学一样古老,在本文中,我们将经历一段短暂的旅程来重新发现它,这样我们就可以在我们的过程模式中更频繁地使用它。左:原始FBM。右图:频带限制型FBM。源+演示:https://www.shadertoy.com/view/3tScWd cos(X)(或sin)是最流行的生成过程性内容的函数之一,因为它周期性、流畅且评估速度非常快(在现代硬件中)。余弦波还具有可以解析积分的优点,因此我们可以使用在模式采样/评估过程中对方波使用的相同滤波技术。基本上,给定一个余弦,我们首先需要知道它在给定像素的足迹上实际覆盖了多少区域。让调用数量w,并使用它对滤波器宽度(或内核大小)等于w余弦进行滤波/卷积/积分,以计算该像素内余弦的平均值:正如我们所看到的,用盒滤波器过滤余弦波与将其与sinc()函数相乘是相同的,如果您了解数字信号处理,这也就不足为奇了。三角形内核也会产生一个解析解,但是出于今天练习的目的,我们将坚持使用盒式过滤器。现在,让我们将其直接应用到程序图案上,例如,我们通过一些区域扭曲来变形的基于余弦的颜色纹理,就像这个:朴素的和过滤的余弦。SOURCE+DEMO:https://www.shadertoy.com/view/wtXfRH在图像的左侧,您可以看到程序纹理的简单实现(基于一系列基于余弦的颜色层),其中直接调用cos(),就像您通常所做的那样。右边是过滤后的版本,其中每个余弦函数都被我们刚刚通过花哨的数学推导出的过滤余弦函数所取代。让我向您展示naive纹理实现的代码://paletteve3 getColor(在浮点型t中){ve3ol=a0;ol+=a1*cos(k2PI*t*w1+k1);ol+=a2*cos(kTAU*t*w2+k2);ol+=a3*cos(k2PI*t*w3+k3);ol+=a4*cos(kTAU*t*w4+k2);ol+=a4*cos(kTAU*t*w4+k2);ol+=a4*cos(kTAU*t*w4+k3。COL+=A7*cos(k2PI*t*w7+k7);COL+=A8*cos(kTAU*t*w8+k8);返回COL;}。

A0=Vec3(0.4,0.4);a1=Vec3(0.0,0.8,1.1),w1=1.1;a2=Vec3(0.3,0.4,0.1),w2=3.1;A3=Vec3(0.1,0.7,1.1),w3=5.1;A4=Vec3(0.2,0.8,1.4),w4=9.1;a5=Vec3(0.2,0.6,0.7),w5=17.1;a6=Vec3(0.1,0.6,0.7),w6=。A7=Vec3(0.0,0.5,0.8),w7=65.1A8=Vec3(0.1,0.4,0.7),w8=115.1;

尽管我在右侧列出了实际调色板的系数,但调色板本身的细节与我们的过滤讨论无关。我们唯一需要知道的是图像的左侧别名,因为颜色余弦波的一些wi频率对于我们正在使用的像素采样率来说太高了。这意味着,有些余弦波在每个像素上振荡太多次,在每个像素一个样本(Aa1x)的情况下,没有办法以稳定的方式捕获这些信息。然而,只有图像别名的某些部分,其他部分则完全没有问题,因为即使是最快的cos波,每个像素的振荡也不到一次。这发生在图像中纹理拉伸最多且cos()波域已经充分减慢的区域。因此,如果不能对纹理进行超级采样,我们可能不得不选择