Mipmap颤动的AlphaClip解决边缘杂色问题
有一种奇怪的现象:
在我的游戏引擎中有一种奇怪的现象,在BaseColor调试开启时:
我把它称做边缘杂色错误。
在Shader中将Clip阈值提高到0.99f可以有效减少这种错误:
if(baseColorTex.a < 0.99f)
{
discard;
}
但在远处看时,植被完全被剃掉了。
我能猜测出来这是因为高级的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;
}
效果似乎还不错??