2013-02-16 66 views
2

我寫了一個非常簡單的穿透幾何着色器。我的輸入基元是點,輸出基元也是點。我也想通過幾何着色器將顏色和法線從頂點着色器轉發到片段着色器。着色器完美地編譯和鏈接,但最終的顏色非常奇怪。我認爲這個轉發有問題。任何人都可以指出問題嗎?這裏是我的着色器:具有普通和顏色的簡單穿透幾何着色器

頂點着色器:

#version 330 compatibility 

struct vData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

out vData vertex; 

void main() 
{ 
    vertex.normal = gl_NormalMatrix * gl_Normal; 
    vertex.color = gl_Color; 
    gl_Position = ftransform(); 
} 

幾何着色器:

#version 330 

layout (points) in; 
layout (points) out; 
layout (max_vertices = 1) out; 

struct vData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

in vData vertices[]; 
out vData frag; 


void main() 
{ 
    int i; 
    for(i = 0;i < gl_in.length();i++) 
    { 
     frag.normal = vertices[i].normal; 
     frag.color = vertices[i].color; 
     gl_Position = gl_in[i].gl_Position; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 

片段着色器:

#version 330 

struct vData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

in vData frag; 

void main() 
{ 
    gl_FragColor = frag.color; 
} 
+2

停止在着色器階段之間通過結構。是的,我知道這是標準在技術上允許的。但沒有人使用它,所以它沒有經過IHV的良好測試。如果你需要分組輸入和輸出,[使用接口塊](http://www.opengl.org/wiki/Interface_Block_%28GLSL%29)。 – 2013-02-16 13:12:50

+0

謝謝你的迴應!我應該遵循這一點! – 2013-02-18 04:30:50

回答

12

我想通了這一點!輸入/輸出變量必須具有相同的名稱,即幾何着色器中的vertices[]應爲vertex[]。而已!

我的細化和工作代碼去如下:

頂點着色器:

#version 330 compatibility 

out vData 
{ 
    vec3 normal; 
    vec4 color; 
}vertex; 

void main() 
{ 
    vertex.normal = normalize(gl_NormalMatrix * gl_Normal); 
    vertex.color = gl_Color; 
    gl_Position = ftransform(); 
} 

幾何着色器:

#version 330 

layout (points) in; 
layout (points) out; 
layout (max_vertices = 1) out; 

in vData 
{ 
    vec3 normal; 
    vec4 color; 
}vertices[]; 

out fData 
{ 
    vec3 normal; 
    vec4 color; 
}frag;  

void main() 
{ 
    int i; 
    for(i = 0;i < gl_in.length();i++)// gl_in.length() = 1 though! 
    { 
     frag.normal = vertices[i].normal; 
     frag.color = vertices[i].color; 
     gl_Position = gl_in[i].gl_Position; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 

片段着色器:

#version 330 compatibility 

in fData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

void main() 
{ 
    gl_FragColor = frag.color; 
} 

快樂編碼!

+1

in fData { vec3 normal; vec4顏色; } frag; – 2015-05-18 07:02:23