繁体   English   中英

DirectX11:基于高度的纹理混合

[英]DirectX11: Height based texture blending

我目前在我的地形项目中使用倾斜量混合了3个纹理。 我通过对每个纹理进行采样,确定斜率值并基于两个纹理之间的拉深来设置纹理颜色来实现此目的。 这是我的像素着色器的代码片段:

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);
}

产生以下内容:

一定高度以上的雪

如何将雪的边缘与其他纹理融合在一起,以使边缘不那么粗糙。 请记住,其他纹理可能已经被勒住了,我想保持纹理的颜色。

感谢您的时间

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

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

这种方法或算法的唯一优点是,它看起来可能不像您希望的那样现实。 这是因为所有雪帽的高度值都完全相同,从而造成了不切实际的周长。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM