我有一个现有的OpenGL ES 3.1应用程序,该应用程序使用颜色和深度/模板附件将场景渲染到FBO。它使用常规绘制方法(glBindBuffer,glDrawArrays,glBlend *,glStencil *等)。现在,我的任务是创建仅深度通道,以与主通道相同的值填充深度附件。
我的问题是:要实现这一目标并避免GPU做多余的工作(不必要的着色器调用等),最少需要执行多少步骤?是否足够停用颜色附件,还是还必须设置空着色器,禁用混合等?
我想您需要在主遍之前运行,否则,您只需保持主遍的深度即可。
Preflight
渲染
选项
在上面的步骤(2),将仅深度遍的深度结果加载为主遍的起始深度可能是有益的。这将为您提供更好的早zs测试精度,但以回读深度值为代价。大多数移动GPU都具有隐藏的表面去除功能,因此这并不总是净收益-它取决于您的内容,目标GPU以及前后绘制顺序的好坏。
您可能要使用专用缓冲区(位置数据在一个缓冲区中交织,非位置在一秒钟中交织)作为主绘图,因为如果剔除原语,许多GPU会优化非位置计算。] >
专用缓冲区和优化的着色器也可以用于阴影映射以及其他此类仅深度的技术。