一个容易疏忽的问题。

图:

    模型的边缘有个碍眼的白边,这个是由于计算水下的caustic的时候用了深度来计算某个tex的uv,结果产生这个白边。(图压缩后变难看了。。。)

这个不是算法错,也不是什么数据问题。而是由于使用的tex带有mipmap,但由于uv从深度算来,因此在ps里,边缘相邻两个像素的uv有个跳变,使gpu在这个地方出现lod计算错误,因此取了一个错误的值。

    解决的办法有两个,一个是自己计算lod,可以通过采样边缘的像素,在xy方向选深度差最小的那个相邻像素来计算ddx ddy。

另一个办法是tex如果尺寸比较小的话可以不要用mipmap,总是用0层,则不会出现问题。

解决后的图:

    这个问题其实存在的地方并不少,只要使用有突然跳跃的数值(比如这里的深度)来计算mipmap tex的uv,则都有可能会出现,不过有些情况下这个问题不太明显。

不解决其实也没啥问题,作为游戏来讲用户也不一定注意,所以这个问题也容易被疏忽,不过如果追求完美的图像的话,就总觉得有些别扭。