2.渲染中深度测试与DrawCall产生
2.1 题目

在没有使用遮挡剔除的情况下,图中A和B都是默认标准材质。图中的小球最终是否会被渲染,是否会产生DrawCall?
2.2 深入解析
是否会被渲染:最终屏幕上不可见(被遮挡)。标准材质默认 ZTest 开启,小球在立方体后方时,该片元深度测试失败,颜色不写入(或依赖 Early-Z 在片元着色前即被丢弃)。
是否会产生 DrawCall:会。DrawCall 由 CPU 提交;只要物体未被视锥体剔除且进入渲染列表,就会为对应 SubMesh 发起绘制。深度测试在 GPU 上决定片元是否保留,与「是否发过 DrawCall」无关。
深度测试时机:与硬件与 Shader 有关;不透明物体常可利用 Early-Z 在片元着色器之前做深度比较,并非一律「先跑完片元着色再测深度」。面试答:DrawCall 是提交阶段,深度测试是光栅化后的可见性判定。
2.3 答题示例
“在无遮挡剔除的情况下:
- DrawCall:小球会产生DrawCall,因为引擎需向GPU提交网格数据以执行深度测试。
- 渲染结果:小球不会被最终显示。标准材质默认启用深度测试(Z-Test),由于小球被立方体遮挡,其片元的深度值大于缓冲区值,测试失败后被丢弃。
注意:DrawCall发生在CPU提交命令时,而深度测试在GPU片元处理阶段执行,两者属于渲染管线的不同阶段。”
2.4 关键词联想
深度测试(Depth Testing)Z-缓冲(Z-Buffer)- DrawCall提交
片元着色器(Fragment Shader)遮挡关系(Occlusion)- 渲染管线阶段
- GPU片元处理
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com