仅按整张图片的显示顺序绘制,在复杂重叠处可能不符合想要的遮挡。深度缓冲为每个像素保存当前最近深度,用局部比较决定新片元是否可见。
先固定规则和输入
练习画布六列四行,矩形边界采用左闭右开、上闭下开。深度为整数,数值小的更靠前。初始为空;新深度严格小于已有深度才覆盖,相同深度保留先画的颜色。
画布6×4,.为空;顺序与列表一致 [[0, 0, 5, 3, 3, 'A'], [1, 1, 6, 4, 3, 'B'], [0, 0, 2, 4, 4, 'C'], [1, 2, 3, 4, 1, 'D'], [3, 1, 5, 2, 3, 'E'], [1, 2, 3, 4, 4, 'F']]
把结果按步骤记下来
绘制A,矩形[0, 0, 5, 3],深度3。实际覆盖像素[[0, 0], [1, 0], [2, 0], [3, 0], [4, 0], [0, 1], [1, 1], [2, 1], [3, 1], [4, 1], [0, 2], [1, 2], [2, 2], [3, 2], [4, 2]];四行画布为AAAAA. / AAAAA. / AAAAA. / ......。
绘制B,矩形[1, 1, 6, 4],深度3。实际覆盖像素[[5, 1], [5, 2], [1, 3], [2, 3], [3, 3], [4, 3], [5, 3]];四行画布为AAAAA. / AAAAAB / AAAAAB / .BBBBB。
绘制C,矩形[0, 0, 2, 4],深度4。实际覆盖像素[[0, 3]];四行画布为AAAAA. / AAAAAB / AAAAAB / CBBBBB。
绘制D,矩形[1, 2, 3, 4],深度1。实际覆盖像素[[1, 2], [2, 2], [1, 3], [2, 3]];四行画布为AAAAA. / AAAAAB / ADDAAB / CDDBBB。
绘制E,矩形[3, 1, 5, 2],深度3。实际覆盖像素[];四行画布为AAAAA. / AAAAAB / ADDAAB / CDDBBB。
绘制F,矩形[1, 2, 3, 4],深度4。实际覆盖像素[];四行画布为AAAAA. / AAAAAB / ADDAAB / CDDBBB。
A与B具有同样深度,重叠处保留A;后续更近的矩形可以覆盖它们,较远或同深度的片元不会覆盖已存颜色。
自己复核的办法
逐像素找出覆盖它的所有矩形,再按深度与绘制先后排序,应该与逐轮绘制得到的画布一致。尤其要检查深度相同的重叠区,因为严格小于和小于等于会给出不同归属。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
使用这个练习的边界
本例没有透明度、抗锯齿或深度精度误差。半透明对象通常还涉及混合顺序,不能直接套用这里的单一最近颜色规则;此处的目标只是把不透明片元的比较过程看清楚。
