Использование gl_ClipDistance в геометрическом шейдере - PullRequest
1 голос
/ 16 июля 2011

Я пытаюсь использовать 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);

My planeDistance() возвращает положительные и отрицательные расстояния в зависимости от того, с какой стороны находится вершина. Я даже пытался записать отрицательные значения в некоторые из gl_ClipDistance[c], но это ничего не обрезает.

Что я делаю не так?

1 Ответ

2 голосов
/ 17 июля 2011

Преобразование с обратной связью происходит сразу после геометрического шейдера, до того, как область просмотра трансформируется или срезается относительно усеченного конуса или пользовательских плоскостей отсечения. Вы не можете получить треугольники после отсечения в буфер преобразования-вывода.

Если вы просто используете этот буфер для обратной передачи в конвейер для последующего рендеринга, вы можете сделать отсечение в этой точке. Или, если вам нужны обрезанные треугольники в буфере обратной связи преобразования, вы можете попытаться выполнить обрезку самостоятельно в геометрическом шейдере (точное совпадение со встроенным отсечением GL будет затруднительным, если это необходимо).

...