Home Forums Games202-高质量实时渲染 作业资料 & 代码勘误 Reply To: 作业资料 & 代码勘误

#8323 Score: 0
YunHsiao
Participant
19 pts

## 作业 1

* 框架提供的 unpack 函数算法实现不准确,在不加 bias 时,会导致严重的 banding(地面一半白一半黑而不是典型的 z-fighting 效果),一定程度上影响作业调试。
准确算法参考[这里](https://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/):
`cpp
// shaders/shadowShader/shadowFragment.glsl
vec4 pack (float depth) {
// 使用rgba 4字节共32位来存储z值,1个字节精度为1/256
const vec4 bitShift = vec4(1.0, 255.0, 65025.0, 16581375.0);
const vec4 bitMask = vec4(1.0/255.0, 1.0/255.0, 1.0/255.0, 0.0);
// gl_FragCoord:片元的坐标,fract():返回数值的小数部分
vec4 rgbaDepth = fract(depth * bitShift); //计算每个点的z值
rgbaDepth -= rgbaDepth.gbaa * bitMask; // Cut off the value which do not fit in 8 bits
return rgbaDepth;
}

// shaders/phongShader/phongFragment.glsl
float unpack(vec4 rgbaDepth) {
const vec4 bitShift = vec4(1.0, 1/255.0, 1/65025.0, 1/16581375.0);
return dot(rgbaDepth, bitShift);
}
`
* 课程框架的清屏操作代码不完整,实际上是没有真正每帧清屏的。glClearColor 和 glClearDepth 只是指定清屏颜色,实际的执行还得再加一句 glClear。
`js
// renderers/WebGLRenderer.js
gl.clearColor(0.0, 0.0, 0.0, 1.0); // Clear to black, fully opaque
gl.clearDepth(1.0); // Clear everything
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
`
清屏操作在处理平面上的一些 artefact 时可以用上。
* 在课程视频 P3 80:26 时,闫老师的原话是:”……也就意味着如果 light 离你比较远,也就是在 shadowmap 上找一个比较小的范围”。这里应该是口误,light 越远应该查询范围越大。这个细节没有在课程任何其他地方提及,除非自己翻一下 N 厂的原论文实现,考虑到不是每个同学都会这么做,所以这个口误影响比较大。