实现仅深度遍的最小步骤

问题描述 投票:0回答:1

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

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

opengl opengl-es
1个回答
0
投票

我想您需要在主遍之前运行,否则,您只需保持主遍的深度即可。

Preflight

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

  1. 使用专用的缓冲区和着色器渲染仅深度的通道,掩盖所有颜色写入。
  2. 使用完整的缓冲区和着色器渲染主通道。
  3. 选项

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.