在几何着色器中使用gl_ClipDistance

时间:2011-07-16 17:01:23

标签: opengl glsl geometry-shader

我正在尝试在几何着色器中使用gl_ClipDistance,但我无法使其工作。 我的着色器在变换反馈记录中运行,我想在4个剪裁平面上切割三角形。

我阅读了GLSL lang规范并试图找到一个完整的例子(没有发现任何)。这是我的着色器的样子(缩短):

#version 150
#extension GL_EXT_gpu_shader4 : require
#extension GL_EXT_geometry_shader4 : require
#pragma optionNV unroll all

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;

in vec4 io_Position[];
in vec3 io_Normal[];
in vec4 io_MultiTexCoord0[];
in vec4 io_MultiTexCoord1[];

...    

out vec3 out_Position;
out vec3 out_Normal;
out vec2 out_MultiTexCoord0;
out vec2 out_MultiTexCoord1;
out float gl_ClipDistance[4]; // do I have to initialize it like that?

void main()
{
  ...

  // emit three vertices
  for (int v=0; v<gl_VerticesIn; v++) 
  {   
      out_Position = io_Position[v].xyz;
      out_Normal = io_Normal[v];
      out_MultiTexCoord0 = io_MultiTexCoord0[v].xy;
      out_MultiTexCoord1 = io_MultiTexCoord1[v].xy;

      // calculate clip distances     
      for(int c=0; c<4; c++) 
      {  
        // From spec: The clip distances will be linearly interpolated across the
        // primitive and the portion of the primitive with interpolated distances less than 
        gl_ClipDistance[c] = distancePlane(clipPlanes[c], triWorldPos[v]);
      }     

      EmitVertex();
  }

  // create triangle
  EndPrimitive();  
}

在开始变换反馈之前,我设置了:

glEnable(GL_CLIP_PLANE0);
glEnable(GL_CLIP_PLANE1);
glEnable(GL_CLIP_PLANE2);
glEnable(GL_CLIP_PLANE3);

我的planeDistance()返回正负距离,具体取决于顶点位于哪一侧。我甚至尝试将负值写入某些gl_ClipDistance[c],但它没有剪辑任何内容。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

变换反馈输出在几何着色器之后,视口变换或对平截头体或自定义剪裁平面进行裁剪之前立即发生。你不能将后剪裁三角形变成变换输出缓冲区。

如果您只是使用此缓冲区反馈到管道中以便以后渲染,则可以在此时进行裁剪。或者,如果您需要在变换反馈缓冲区中使用剪切三角形,您可以尝试在几何着色器中自己进行剪切(如果需要,匹配GL的内置剪辑将非常困难)。