【发布时间】: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