2010-10-31 73 views
1

我只是將一些幾何着色器弄成一個GL_POINTS列表並輸出一個帶有三角形條紋的框。我有它基本上工作,但是當我放大/縮小或平移三角形帶走遍各地,並沒有保持其在世界上的位置,但仍然正確畫框。幾何着色器 - 指向不保持世界位置的三角形條紋

例如,如果我給輸入端(5,5,0),它會繪製這些點的三角形帶,使一個框:

(5,5,0)
(5.5,5, 0)
(5,5.5,0)
(5.5,5.5,0)

頂點着色器:


// Vertex Shader 
#version 130 

in vec4 vVertex; 

void main(void) 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * vVertex; 
} 

幾何着色器:


version 130 
#extension GL_EXT_geometry_shader4 : enable 

void main(void) 
{ 
    vec4 a; 
    vec4 b; 
    vec4 c; 
    vec4 d; 

    int i = 0; 
    for(i = 0; i gl_VerticesIn; i++) 
    { 
     a = gl_PositionIn[i]; 
     //a.x -= 0.5; 
     //a.y -= 0.5; 
     //a.z = 0.0; 
     gl_Position = a; 
     EmitVertex(); 

     b = gl_PositionIn[i]; 
     b.x += 0.5; 
     //b.y -= 0.5; 
     //b.z = 0.0; 
     gl_Position = b; 
     EmitVertex(); 

     d = gl_PositionIn[i]; 
     //d.x -= 0.5; 
     d.y += 0.5; 
     //d.z = 0.0; 
     gl_Position = d;   
     EmitVertex(); 

     c = gl_PositionIn[i]; 
     c.x += 0.5; 
     c.y += 0.5; 
     //c.z = 0.0; 
     gl_Position = c; 
     EmitVertex(); 

    } 
    EndPrimitive(); 

} 

我很可能錯過了一些愚蠢的東西。

回答

3

取而代之,將頂點着色器中的每個頂點乘以gl_ModelViewMatrix。在世界空間中推理起來要容易得多。

之後,您可以做幾何着色器中的工作,但不要忘記在投射矩陣之前將頂點乘以投影矩陣。這應該可以解決您的問題。

編輯:我忘了ModelViewMatrix轉換爲查看空間,對不起。只需傳遞VS中的頂點而不做任何事情。這意味着你仍然會在GS的模型空間中。在GS中進行抵消工作,然後在發射前用gl_ModelViewProjectionMatrix進行轉換。

+0

所以我應該改變我的頂點着色器:gl_Position = gl_ModelViewMatrix * vVertex;然後在我的幾何着色器中,我應該爲所有verticies執行此操作:gl_Position = a * gl_ProjectionMatrix; – cuatro 2010-10-31 15:19:37

+0

這就是我會嘗試的,是的。 – Stringer 2010-10-31 15:24:01

+0

當平移/縮放時除了現在盒子也扭曲外,還存在同樣的問題。 – cuatro 2010-10-31 15:24:02

1

幾何着色器在頂點着色器之後運行。所以你對頂點做出的改變是在屏幕座標上進行的,而不是世界。