分布模式(纹理)和斜坡数学?

时间:2012-07-25 07:23:11

标签: math textures hlsl

我正在尝试实现斜坡效果,如下所示: http://wiki.splashdamage.com/upload/d/d4/Simplemega_dist_ramps.jpg

基于分布模式混合纹理很容易。基本上,就这个(HLSL):

Result = lerp(SampleA, SampleB, DistributionPatternSample);

哪个有效,但没有斜坡。 http://aaronm.nuclearglory.com/private/stackoverflow/result1.png

我的第一个猜测是,要加入“斜坡因子”,我可以这样做:

Result = lerp(A, B, (1.0f - Ramp)*Distribution);

然而,这不起作用,因为如果Ramp也是1.0,结果将为零,导致仅使用'A'。这是当Ramp使用该方法为1.0f时得到的结果: http://aaronm.nuclearglory.com/private/stackoverflow/result2.png

我试图将斜坡与分布相乘,这显然是不正确的。 (想象一下尝试发现有趣的效果值得一试。没有发现有趣的效果。)

我也尝试从分布中减去Ramp,如下所示:

Result = lerp(A, B, saturate(Distribution - Ramp));

但问题在于斜坡是为了控制混合物的清晰度。所以,这也没有做任何事情。

我希望有人可以通过数学方式告诉我我需要做些什么来实现这个目标。我试图避免分支,因为这是着色器代码。我可以通过乘以结果来模拟分支,但我不想这样做。我也希望有人可以告诉我为什么数学的表达方式与锐度一样。在不知道如何使用数学的情况下进行数学运算会很麻烦。

对于上下文,该顶部图像来自此处: http://wiki.splashdamage.com/index.php/A_Simple_First_Megatexture

我理解MegaTextures(剪贴图方法)和虚拟纹理(更高级的方法)如何正常工作。所以我不需要任何解释。我只是想在着色器中实现这种特殊的混合。

作为参考,这是我正在使用的分布模式纹理 http://aaronm.nuclearglory.com/private/stackoverflow/distribution.png

1 个答案:

答案 0 :(得分:1)

它们的坡道宽度基本上只是分布图上的对比度变化。这是一个简单的重新缩放和钳制。

我们要保留的东西是0.5映射到0.5,并且纹理在宽度为w的区域上从0到1。

这给出了

x = 0.5 + (x-0.5)/w

这意味着最终的HLSL将如下所示:

Result = lerp(A, B, clamp( 0.5 + (Distribution-0.5)/w, 0, 1) );

现在,如果最终看起来边缘锯齿,你可以切换到使用smoothstep。在shich的情况下,你会得到

Result = lerp(A, B, smoothstep( 0.5 + (Distribution-0.5)/w, 0, 1) );

但是,有一点要记住,这种类型的阈值处理最适合smoothish分布模式。我不确定你的它是否足够光滑(除非这是一个巨型纹理的小版本,在这种情况下,你很可能没问题。)