Mipmap颤动的AlphaClip解决边缘杂色问题

有一种奇怪的现象:

在我的游戏引擎中有一种奇怪的现象,在BaseColor调试开启时:

Image

我把它称做边缘杂色错误。

在Shader中将Clip阈值提高到0.99f可以有效减少这种错误:

if(baseColorTex.a < 0.99f)
{
	discard;
}

但在远处看时,植被完全被剃掉了。

Image

我能猜测出来这是因为高级的mipmap没有对alpha通道做任何特殊的处理,我生成mipmap时是用的最简单的Box滤波器。

(2023年更新): 简单的Alpha的mipmap会导致其整体coverage下降,在Nv texture的处理中会计算Mip0的alpha coverage,然后每个mipmap层级都会乘上一个倍数让Alpha Coverage保持一致性。

我不想那么麻烦,于是想了个简单的补救方案:

float mipmapLevel = textureQueryLod(BaseColorTexture, inUV0).x;
float mipmapDitherFactor = min(0.8f, mipmapLevel / MAX_MIPMAP);
if(baseColorTex.a < (0.99f - mipmapDitherFactor))
{
	discard;
}

效果似乎还不错??

Image

Image

© - 2024 · 月光下的旅行。 禁止转载