【问题标题】:DirectX11: Height based texture blendingDirectX11:基于高度的纹理混合
【发布时间】:2016-03-24 12:24:21
【问题描述】:

在我的地形项目中,我目前有 3 个使用坡度量混合的纹理。我通过对每个纹理进行采样、确定斜率量并根据两个纹理之间的 lerp 设置纹理颜色来做到这一点。这是我的像素着色器的 sn-p:

static const float TEX_LOW_BOUND    = 0.4f;
static const float TEX_HIGH_BOUND   = 0.7f; 

...    

float4 texColour;
float4 lowColour = lowerTex.Sample(SWrap, pin.Tex);
float4 midColour = middleTex.Sample(SWrap, pin.Tex);
float4 hiColour  = upperTex.Sample(SWrap, pin.Tex);
float slope      = 1.0f - pin.Normal.y;

if (slope < TEX_LOW_BOUND)
{
    texColour = lerp(lowColour, midColour, slope / TEX_LOW_BOUND);
}
else if (slope >= TEX_LOW_BOUND && slope < TEX_HIGH_BOUND)
{
    texColour = lerp(midColour, hiColour, (slope - TEX_LOW_BOUND) * (1.0f / (TEX_HIGH_BOUND - TEX_LOW_BOUND)));
}
else if (slope >= TEX_HIGH_BOUND)
{
    texColour = hiColour;
}

我想添加最终的雪纹理,以应用到某个高度以上。我使用以下方法在顶点着色器中获取高度值:

vout.WHeight = mul(vin.Pos, worldMatrix).y;

然后我可以在我的像素着色器中使用它将纹理颜色设置为高于某个高度的雪:

if (pin.WHeight > 35.0f)
{
    texColour = snowTex.Sample(SWrap, pin.Tex);
}

这会产生以下内容:

如何将雪的边缘与其他纹理混合,以使边缘不那么刺眼。请记住,其他纹理可能已经被 lerped,我想保持纹理颜色。

感谢您的宝贵时间

【问题讨论】:

  • 与坡度相同。
  • 我如何将高度值与基于斜率的线性插值相结合。我只是想融合雪的边缘,所以它越往下山就越消失。
  • 在斜坡部分(我们称之为“草”)后取最终颜色,取雪色。计算作为高度函数的插值系数(例如:绝对雪:高度 200 或更高,雪色量 100%;绝对草:高度低于 150,雪色量 0%)。做 lerp(或任何你喜欢的混合功能)。

标签: c++ directx texture-mapping direct3d11


【解决方案1】:

您可以执行与添加雪帽颜色时基本相同的操作,但您需要的是一个范围输入来确定它是否靠近边缘。有几种方法可以做到这一点。一种方法是将像素值与颜色加法或减法混合,然后在颜色值范围之间进行归一化。另一种是应用多重纹理混合。正如您在if (pin.WHeight > 35.0f) 上面的条件中所述,我们知道 35.0f 是您开始应用雪纹理之前的最大高度值。根据您想要的结果,您的基于范围的输入可能类似于:if ( height &gt; 34.8f &amp;&amp; height &lt; 35.2f ) { apply texture blending or color blending; }

另一种方法是在原始图层之上使用带有透明度衰减图层的 alpha 值,使用相同的范围输入来产生所需的输出。

这种方法或算法的唯一问题是它看起来可能不像您希望的那样真实。这是因为所有雪帽都将具有完全相同的高度值,从而产生不切实际的周长。

与您的原始方法接近的建议可能会更好。将纹理或颜色应用于雪帽时,您可以使用一种不确定的算法,该算法会在最小范围内随机选择特定高度来应用纹理 - 纹理混合,然后任何超过特定高度的东西都会平滑成纯白色.这样每个山顶都会有一个白色的帽子,但并非所有的高度在下限处都相同。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多