实施仅深度通道的最少步骤

时间:2020-01-29 12:12:54

标签: opengl-es

我有一个现有的OpenGL ES 3.1应用程序,该应用程序使用颜色和深度/模板附件将场景渲染到FBO。它使用通常的绘制方法(glBindBuffer,glDrawArrays,glBlend *,glStencil *等)。现在,我的任务是创建仅深度通道,以与主通道相同的值填充深度附件。

我的问题是:要实现这一目标并避免GPU做多余的工作(不必要的着色器调用等),最少需要执行多少步骤?是否足以停用颜色附件,还是我还必须设置空着色器,禁用混合等?

1 个答案:

答案 0 :(得分:0)

我认为在主通行证运行之前您需要这样做,否则您只需保留主通行证深度即可。

预照

  1. 创建专门的缓冲区,仅包含计算位置所需的网格数据(与所有非位置数据解交织)。
  2. 创建专用的顶点着色器(仅计算输出位置)。
  3. 使用最简单的有效片段着色器链接程序。

渲染

  1. 使用专用的缓冲区和着色器渲染仅深度的遍,掩盖所有颜色写入。
  2. 使用完整的缓冲区和着色器渲染主过程。

选项

在上面的步骤(2)中,加载仅深度遍的深度结果作为主遍的起始深度可能是有益的。这将为您提供更好的早zs测试精度,但以回读深度值为代价。大多数移动GPU都具有隐藏的表面去除功能,因此这并不总是净收益-它取决于您的内容,目标GPU以及前后绘制顺序的好坏。

您可能想将专用缓冲区(位置数据在一个缓冲区中交织,非位置在一秒钟中交织)用于主绘图,因为如果剔除原语,许多GPU会优化非位置计算。

专用缓冲区和优化的着色器也可以用于阴影映射以及其他此类仅深度的技术。

相关问题