3d 修改绘制调用之间的深度值

3d 修改绘制调用之间的深度值,3d,webgl,depth-buffer,3d,Webgl,Depth Buffer,我将从我打算做的总体想法开始,我的问题是如何在深度缓冲区上实现实际操作: 一般情况有一个平面p,它将两个半空间a和B分开。相机位于a中。我有一些几何图形,所有这些都需要通过深度测试进行渲染。有些仅包含在A中,有些仅包含在B中,有些可能跨越边界平面P 目标现在我希望在区域A和B中使用不同的顶点着色器进行渲染,尽管这些顶点着色器在边界平面p上的行为相同。细节不重要。以下是我希望如何画这幅图的细节,这是很重要的一点 将与平面P对应的深度绘制到深度缓冲区中 启用深度测试并使用第一个顶点着色器绘制与区域A

我将从我打算做的总体想法开始,我的问题是如何在深度缓冲区上实现实际操作:

一般情况有一个平面p,它将两个半空间a和B分开。相机位于a中。我有一些几何图形,所有这些都需要通过深度测试进行渲染。有些仅包含在A中,有些仅包含在B中,有些可能跨越边界平面P

目标现在我希望在区域A和B中使用不同的顶点着色器进行渲染,尽管这些顶点着色器在边界平面p上的行为相同。细节不重要。以下是我希望如何画这幅图的细节,这是很重要的一点

  • 将与平面P对应的深度绘制到深度缓冲区中
  • 启用深度测试并使用第一个顶点着色器绘制与区域A相交的所有三角形
  • 对于在步骤2中未更改的任何深度值,将其设置为无穷大,保持缓冲区的其余部分不变
  • 再次启用深度测试,但这次使用第二个顶点着色器,绘制与区域B相交的所有三角形
  • 对该工作流的评论这将提供我想要的效果,并且应该是有效的,因为当我们绘制几何体时,我们没有丢弃碎片或在碎片着色器中设置深度。包含在两个区域中的三角形绘制两次,每次调用一次,但这是不可避免的。我们唯一一次“违反规则”是在第3步,但这根本不涉及太多计算

    问题如何编辑步骤3中的深度缓冲区?我想使用OpenGLES2.0(WebGL)


    我可以使用模具缓冲区来实现相同的效果吗?如果是,怎么做?

    为什么要这样做?使用模具缓冲区不是更有意义吗?着色器a和B在区域a中的行为是否完全相同?否则,您的解决方案可能不会起作用。否则,有一种更简单的方法(在a之前绘制B,或模板)Nicol,用另一种方法可能有意义。我已经考虑过使用模具缓冲区,但还没有找到可行的解决方案。我做的唯一一个需要多个渲染目标,但我认为这将是缓慢的,我不想要的内存成本。如果你能看到另一种方法,那么我很高兴听到。请说,你是对的!我实际上没有注意到这一要求,但对于我的着色器,B的行为方式与区域A中的着色器A相同。您可能会问,为什么不在任何地方都使用着色器B,而是与区域B相交的几何体具有附加属性,它使用模板缓冲区来剔除碎片。为什么必须这样做?使用模具缓冲区不是更有意义吗?着色器a和B在区域a中的行为是否完全相同?否则,您的解决方案可能不会起作用。否则,有一种更简单的方法(在a之前绘制B,或模板)Nicol,用另一种方法可能有意义。我已经考虑过使用模具缓冲区,但还没有找到可行的解决方案。我做的唯一一个需要多个渲染目标,但我认为这将是缓慢的,我不想要的内存成本。如果你能看到另一种方法,那么我很高兴听到。请说,你是对的!我实际上没有发现这一要求,但对于我的着色器,B的行为方式与区域A中的着色器A相同。您可能会问,为什么不在任何地方都使用着色器B,而是与区域B相交的几何体具有附加属性,它使用模具缓冲区来剔除碎片。