glDrawElementsInstanced用不同的剪刀

时间:2015-11-16 00:44:02

标签: opengl

是否可以为使用glDrawElementsInstanced绘制的每个实例设置不同的剪刀测试参数?如果是这样,怎么样?如果没有,那么在片段着色器中实现剪刀测试的最便宜的方法是什么?这样做是否有任何性能方面的考虑?

1 个答案:

答案 0 :(得分:1)

不,在绘制调用期间无法更改剪刀矩形。我想到了几个选项:

  • 将剪辑矩形指定为每个实例顶点属性,将其传递给片段着色器,检查片段是否在矩形内,否则discard
  • 应用用户剪辑平面。

第二个选项应该更有效,因为它允许您在剪辑矩形进入片段着色器之前剪切它们之外的几何体。

要使用现代OpenGL应用用户剪辑平面,可以在顶点着色器中为预定义gl_ClipDistance数组的元素指定值,并启用GL_CLIP_DISTANCEi。以下是在您的用例中应用此功能的主要步骤:

  1. 引入定义剪辑矩形的每实例顶点属性。您可以将矩形描述很好地拟合到vec4类型的属性中。例如,定义属性以包含要剪切的矩形的值(xMin,xMax,yMin,yMax)。

  2. 在顶点着色器中,定义属性:

    in vec4 ClipRect;
    

    并根据您的顶点坐标coord设置剪辑距离:

    gl_ClipDistance[0] = coord.x - ClipRect[0];
    gl_ClipDistance[1] = ClipRect[1] - coord.x;
    gl_ClipDistance[2] = coord.y - ClipRect[2];
    gl_ClipDistance[3] = ClipRect[3] - coord.y;
    

    请注意,要保留的点的指定距离必须为正,对于要剪切的点,指定的距离为负。您还必须确保您在此处使用的坐标位于指定矩形边界的相同坐标系中。

  3. 在客户端代码中,在开始绘制之前,启用剪裁平面:

    glEnable(GL_CLIP_DISTANCE0);
    glEnable(GL_CLIP_DISTANCE1);
    glEnable(GL_CLIP_DISTANCE2);
    glEnable(GL_CLIP_DISTANCE3);