c++ - DirectX11 : Height based texture blending

标签 c++ directx texture-mapping direct3d11

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

相关文章:

c++ - 如何将数字添加到字符串?

android - simd 是否包含在 Android NDK 中

c# - MF SinkWriter写入样本失败

c++ - 指向 D3D11device vtable 的正确指针

javascript - ThreejstextureLoader - 缩放和映射到网格

graphics - 为什么我们需要纹理过滤(双线性、三线性、各向异性......)

c++ - 检查内存值

c++ - 与 .mm 源链接时 ObjC 框架的 undefined symbol

c++ - 在现有图形应用程序上绘制 DirectX/OpenGL 图形

c++ - 在 OpenGL 中映射纹理