Home Forums Games202-高质量实时渲染 [作业1]关于PCSS边界明显的Tip Reply To: [作业1]关于PCSS边界明显的Tip

#8209 Score: 0
JH
Participant
3 pts

不好意思我可能有点没说清楚…我的意思是修改PCSS中step2 penumbra size的计算,而所有关于shadow map中深度的比较都是用的[0,1]范围的深度这个没错。
这个是我原来的代码

float filterSize = (coords.z / avgBlockerDepth - 1.0) * LIGHT_WIDTH_UV;
float ret = PCF(shadowMap, coords, filterSize);

其中coord.z和avgBlockerDepth都是[0,1]的值。
这个是我更新后的代码

float vsReceiverDepth = linearizeDepth(coords.z);
 float vsBlockerDepth = linearizeDepth(avgBlockerDepth);
 float filterSize = (vsReceiverDepth / vsBlockerDepth - 1.0) * LIGHT_WIDTH_UV;
 float ret = PCF(shadowMap, coords, filterSize);

简单来说就是把这里normalized的depth转换到linear depth再求解filterSize。我非常同意你说的有可能改一点就会让结果差很多,比如你可以加一个scalar来进行调参,不过这样并不能保证是physically correct的。我的理解是求解filterSize的本质是相似三角形,不过当所有距离都进行来非线性变换(从linear depth变成[0,1])之后相似三角形的比例关系并不能保证一定满足,所以这里利用linear depth求解是比较合理的。实践上来看我自己的测试也得到了更好的效果,同时我也参考了一些别人的实现,包括Nvidia的实现(http://developer.download.nvidia.com/whitepapers/2008/PCSS_Integration.pdf),感觉大多都是使用linear depth来计算的。
这些就是我大致的理解和推测,如果有问题的话欢迎继续讨论:)