Opengl es 实施仅深度通行证的最小步骤

Opengl es 实施仅深度通行证的最小步骤,opengl-es,Opengl Es,我有一个现有的OpenGL ES 3.1应用程序,它通过颜色和深度/模具附件将场景渲染到FBO。它使用常用的绘图方法(glBindBuffer、GLDrawArray、glBlend*、glStencil*等)。我现在的任务是创建一个仅深度的过程,该过程使用与主过程相同的值填充深度附件 我的问题是:实现这一点和避免GPU做多余工作(不必要的着色器调用等)所需的最少步骤数是多少?停用颜色附件是否足够,或者我是否还必须设置空着色器、禁用混合等?我假设您在运行主过程之前需要此功能,否则您只需保留主过程

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


我的问题是:实现这一点和避免GPU做多余工作(不必要的着色器调用等)所需的最少步骤数是多少?停用颜色附件是否足够,或者我是否还必须设置空着色器、禁用混合等?

我假设您在运行主过程之前需要此功能,否则您只需保留主过程深度

飞行前

  • 创建只包含计算位置所需的网格数据(从所有非位置数据中分离)的专用缓冲区
  • 创建专用顶点着色器(仅计算输出位置)
  • 使用最简单的有效片段着色器链接程序
  • 渲染

  • 使用专门的缓冲区和着色器渲染“仅深度”过程,屏蔽所有颜色写入
  • 使用完整的缓冲区和着色器渲染主过程
  • 选项

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

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


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

    Ok附加问题:使用glColorMask是否可以为片段着色器节省任何这些步骤(因为如果着色器不写入frag深度,驱动程序应该知道片段着色器很简单,对不对?),使用彩色遮罩可能会优化这一点。不过,顶点着色器中任何无意义的非位置内容都可能仍然会被执行。只需专门化—这是更多的开发工作,但这是“正确”的答案,将提高运行时性能。