uebian
1
我在完成实验"软渲染器:局部光照 (15 分)"的过程中遇到了高光面积过大的问题。以下是我的渲染结果和标准答案的渲染结果。
我的渲染结果是按照这个步骤得到的:
- 加载 cow.dae
- 添加一个点光源并将其位置调整为 (2.0, 2.0, 2.0)
- 将相机位置也调整为 (2.0, 2.0, 2.0)
我没有修改任何其他参数。
很明显,在我的渲染那结果中牛头和牛身部位的高光面积大于标准答案中的高光面积。
我自己建立了一个球体的模型,并对其进行渲染,然后将结果和理论进行比较没有发现异常情况。
我希望知道:
- 出现这类问题可能的排查思路有哪些?
- 这种情况属于会导致扣分的"因为光照模型实现不正确导致高光范围偏大(或偏小)不在豁免范围内"吗?
roland
(李昌洲)
2
请问你在计算 specular 的时候,高光衰减的指数 p 值是如何设定的呢?考察验收的重点在于整个实现流程实现和理解的正确性,如果单纯因为参数设置不同导致的结果有细微差异,则不会成为扣分项,所以不必追求与文档中的结果完全一致。
请问你对 interpolate 这个函数中的 weight 和 Z 是怎么设定的呢?
uebian
4
对于 weight,我使用了 w1, w2, w3, 其中 w1, w2, w3 是原始三角形的三个顶点坐标经过 MVP 变换之后的向量的第四维。对于 Z,我使用了 1 / (alpha / w1 + beta / w2 + gamma / w3)
如果你想要检查高光问题,这里给出一个简单的排查方法:
- 在自己的 fragment shader 函数中注释掉 ambient 和 diffuse 项,只取 specular 作为最后的着色结果并渲染一张图。
- 使用我们发布的预编译版本加载相同的物体,将物体的 ambient 和 diffuse 材质都设为纯黑色 (0, 0, 0) ,在相同视角下渲染一张图。
这相当于让着色时的 ambient 和 diffuse 项都始终为零,从而只显示出高光部分的着色结果。此时你可以对比自己程序与预编译版本的渲染结果有何差异,确定是不是高光范围算大了。