2011-07-16 105 views
1

我試圖在幾何着色器中使用gl_ClipDistance,但是我無法使它工作。 我的着色器在變換反饋記錄中運行,我想剪切4個剪切平面的三角形。在幾何着色器中使用gl_ClipDistance

我閱讀了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

變換反饋輸出在幾何着色器之後,在視口轉換或剪裁平截頭體或自定義剪切平面之前立即發生。您無法將剪輯後的三角形放入轉換輸出緩衝區中。

如果您只是使用此緩衝區反饋到管道中以供以後再現,則可以在該點進行剪切。或者,如果在變換反饋緩衝區中需要修剪三角形,則可以嘗試在幾何着色器中自行修剪(如果需要,與GL的內置修剪完全匹配將很困難)。

+0

啊......這是我從來不太確定的事情。我認爲剪輯仍然會在變換反饋中執行。這:[http://wiki.delphigl.com/index.php/Transform-Feedback]給出了一個很好的概述。我將嘗試記錄clipDistance並將其應用於實體渲染。 –