gpt4 book ai didi

c++ - DirectX11 : Height based texture blending

转载 作者:行者123 更新时间:2023-11-28 05:55:02 25 4
gpt4 key购买 nike

目前,在我的地形项目中,我有 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);
}

产生以下内容:

Snow above a certain height

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

谢谢你的时间

最佳答案

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

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

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

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

关于c++ - DirectX11 : Height based texture blending,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34344677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com