2012-07-25 49 views
1

我试图达到的斜坡效果看这里: 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); 

然而,这并不因为工作,如果斜坡也是1.0的结果将是零,导致刚'A'被使用。这就是我用Ramp获得1.0f时所得到的结果: http://aaronm.nuclearglory.com/private/stackoverflow/result2.png

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

我也试图从分布减去斜坡,就像这样:

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.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分布patters。我不确定你的足球是否足够光滑(除非这是一个巨型纹理的小版本,在这种情况下你可能没问题)。