1

ジオメトリ シェーダー内で使用しようとしていますが、機能させる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);

MyplaneDistance()は、頂点がどちら側にあるかに応じて、正と負の距離を返します。一部の に負の値を書き込んでみましたgl_ClipDistance[c]が、何もクリップしません。

私は何を間違っていますか?

4

1 に答える 1

2

トランスフォーム フィードバック出力は、ジオメトリ シェーダーの直後、ビューポートのトランスフォームまたは錐台またはカスタム クリップ プレーンに対するクリッピングの前に発生します。クリッピング後の三角形を変換出力バッファーに入れることはできません。

このバッファを使用してパイプラインにフィードバックし、後でレンダリングする場合は、その時点でクリッピングを実行できます。または、トランスフォーム フィードバック バッファーでクリップされた三角形が必要な場合は、ジオメトリ シェーダーで自分でクリッピングを実行してみてください (必要な場合、GL の組み込みクリッピングを正確に一致させることは困難です)。

于 2011-07-16T22:13:18.157 に答える