2011-02-17 47 views
3

glPolygoneMode(GL_FRONT_AND_BACK, GL_FILL)已打開,如何在此情況下獲取線框?沒有任何方法可以在沒有開關多邊形模式的情況下獲得線框渲染爲GL_LINEOpenGL中的線框

+0

神祕的着色器(或黑魔法與α-深度融合)的任何答案被接受 – infra

+0

glPolygoneMode(GL_FRONT_AND_BACK,GL_FILL)是,我無法將其關閉 – infra

+2

你能告訴我們爲什麼你不能關掉它? – Hannesh

回答

18
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

填充填滿它...你想要線條。

編輯: 記住,你可以隨時把它放回去,以填補當你做,這樣

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
// add polygons here 
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
+0

不,我不能關閉多邊形模式GL_FILL – infra

+2

@infra請注意解釋爲什麼不能? –

+0

@infra GL_FILL將填充多邊形。無話可問。你無法避免這種情況。如果你想要做線框,你必須「GL_LINE」。這是openGL爲線框提供的機制! – corsiKa

2

你的問題不太清楚,但我想這要渲染兩個多邊形填充和線框。事實證明,這並不是那麼簡單。解決這個問題的一個經典的方式是:

glPolygonMode(... GL_FILL); 
draw(); 
glPolygonOffset(param1, param2); 
glPolygonMode(... GL_LINE); 
draw(); 

但這也不是沒有問題,比如搞清楚的值傳遞給glPolygonOffset

3

從你的問題我假設你有一些巨大的中間件,並且只能訪問着色器,對嗎?

在這種情況下,建立在你的頂點着色變化的調用,例如,vertexID:

varying float vertexID; # in GLSL <= 3, or 
out float vertexID;  # in GLSL 4 

並給它內置gl_VertexID:

vertexID = (float)gl_VertexID; 

這樣,你」會從片段着色器中獲得對gl_VertexID的訪問權限,但可以插入!這很好,因爲它將是,例如,在一個頂點2,鄰居3和中間2.5。

所以你只需要檢查vertexID是否接近2(3):如果是的話,你接近邊緣。這應該足以用於可視化&調試。

in float vertexID; # or 
varying float vertexID; 

// blabla 

if (fract(vertexID) < 0.1){ 
    outcolor = vec4(1,0,0,0); # in glsl 4 
} 

請注意,您將只能以這種方式得到每個三角形的兩條邊。也許有些會變得稀薄(如果一個頂點ID是2,另一個是1000,那麼0.1的區域很少)。在渲染場景的所有時間

+0

是的,你是對的:系統是着色器導向的(意味着只有可編程管道)。你的答案非常接近,謝謝! – infra

+0

但它看起來很奇怪 - 在場景中爲所有對象添加着色器:( – infra

+0

@infra我沒有收到最後一條評論,如果你願意,可以只爲一個網格設置它,我的意思是,如果你的系統允許的話。 – Calvin1602