GAMES202 作业1-part1
应老师要求不会直接放上作业答案,会记录整体思路
Two Pass Shadowmap
主要实现硬阴影,在shadowmap作业中需要修改的地方有两个
DirectionalLight.js中CalcLightMVP()函数
MVP函数的参数签名如下
CalcLightMVP(translate, scale){}
首先需要做的是根据translate和scale进行model transform
1 | // 主要使用的两个函数 |
接着是view transform,这里是根据提供的lightPos,focalPoint和lightUp进行lookat矩阵的构造
1 | // lookAt函数 |
最后是投影矩阵,根据作业提示推荐使用了正交投影
1 | // 投影矩阵设置 |
phongFragment.glsl中useShadowMap()函数
首先通过shadowCoord获取坐标并通过texture2D()进行采样
vec4 depth_raw =texture2D(shadowMap,shadowCoord.xy);
接着通过unpack函数对depth进行decode
float depth_decode =unpack(depth_raw);
然后通过跟shadowCoord.z的值进行深度比较得到阴影
if(depth_decode > shadowCoord.z)
在main中对坐标进行NDC操作并传入函数,得到结果
1 | // NDC |
出现如下错误原因是model transform顺序设置问题,本来操作应该是先缩放,再旋转,最后平移。但是这里是先translate,再scale(原因是将光源当作相机生成深度图,但是变换的时候本来思路是从原点变换到光源位置,但是在view transform的思路是逆变换,因此需要反过来) — 这里可能理解有误,mark一下,因为和朋友直接手写变换矩阵的时候按照SRT的顺序是对的
修改后如下
另一个需要优化的地方是阴影周围的锯齿,通过添加bias的方法,可以让整个阴影更加平滑。
1 | float getBias(){ |