2011-06-14 57 views
3

我在編寫點透明幾何着色器時遇到了一些問題。我想應該是這樣的:點的透視幾何着色器

#version 330 
precision highp float; 

layout (points) in; 
layout (points) out; 

void main(void) 
{ 
    gl_Position = gl_in[0].gl_Position; 
    EmitVertex(); 
    EndPrimitive(); 
} 

我有一堆我不指定幾何着色器顯示在屏幕上的點,但是當我嘗試這個着色器鏈接到我的着色器程序,沒有點出現並且沒有報告錯誤。

我使用C#和OpenTK,但我不認爲這是問題所在。

編輯:人們請求其他着色器,但我沒有使用幾何着色器測試這些着色器,並且它們在沒有幾何着色器的情況下工作正常。

頂點着色器:

void main() 
{ 
    gl_FrontColor = gl_Color; 
    gl_Position = ftransform(); 
} 

片段着色器:

void main() 
{ 
    gl_FragColor = gl_Color; 
} 
+1

這可能與[this](http://stackoverflow.com/questions/3936368/geometry-shader-doesnt-do-anything-when-fed-gl-points)有關,因爲我正在測試這個在ATI顯卡上。 – 2011-06-14 21:00:45

+1

你能發佈附加到這個程序的其他着色器嗎? – kvark 2011-06-14 21:50:47

+0

@Nocturne也許用新的語法(比如'layout(points)')和舊的過時的語法(比如'ftransform'或固定函數變化)混合起來不是一個好主意。但我只是發現另一件事,會更新我的答案。 – 2011-06-15 21:17:01

回答

4

我沒那麼肯定確定(與幾何着色器沒有實際經驗),但你不必須指定最大輸出頂點數。在你的情況下,它只是一個,所以儘量

layout (points, max_vertices=1) out; 

也許着色器編譯成功地,因爲你仍然可以通過API指定頂點的數量(至少在兼容性,我認爲)。

編輯:您可以使用內置的不同gl_FrontColor(並閱讀片段着色器gl_Color),但隨後在幾何着色器,你不把它傳播到片段着色器(它不會自動傳播)。

這給我們帶來了另一個問題。您可以將新語法(如gl_in)與舊的棄用語法(如ftransform和內置顏色變化)混合使用。也許這不是一個好主意,在這種情況下,您遇到了問題,因爲如果我沒有記錯,gl_in沒有gl_Colorgl_FrontColor成員。因此,最好的辦法是使用自己的顏色變量作爲頂點和幾何着色器的變量out,以及作爲in變量的幾何和片段着色器(但請記住in必須是幾何着色器中的數組)。

+0

你是對的,我確實忘記了這一點,但不幸的是,這些觀點仍然沒有出現。 – 2011-06-14 20:57:40

+0

非常感謝,我設法讓它工作。我現在並不需要顏色,所以我剛剛用'gl_FragColor = vec4(1.0,1.0,1.0,1.0);'替換了片段着色器。不過,我應該清理所有不贊成使用的語法。 – 2011-06-16 09:23:03