2017-03-28 25 views
0

爲了好玩,我試圖用(現代)OpenGL構建一個微型Blender。作爲它的一部分,我希望用戶能夠選擇頂點。每次用戶選擇一個頂點時,我都希望頂點變成紅色。我的問題與查找相交頂點無關,而是人們如何將拾取的頂點可視化。 我設法用油漆拾取三角形(而不是挑頂點)在我的片段着色器執行以下操作:在OpenGL中對網格進行Vizualizing頂點拾取

if(gl_PrimitiveID==intersectingFace) 
     color=vec4(1.0f,0.0f,0.0f,1.0f); 

其中intersectingFace是保存meshe的交叉面的指標的統一。

爲了選擇一個頂點而不是一個面,我想將一個球面網格加載到我的場景中,縮小它並將其中心平移到相交頂點的位置。我想知道是否有一個更簡單的解決方案,這一個。

回答

0

有一個內置變量,告訴你頂點的索引,而不是原語:gl_VertexID

gl_VertexID:當前正在處理的頂點索引。
當使用非索引渲染的 時,它是當前頂點(處理的頂點數+第一個值)的當前 的有效索引。對於 索引渲染,它是用於從 緩衝區獲取此頂點的索引。

注意:gl_VertexID將應用基本頂點。

因此而不是設置交叉面均勻值,像你現在這樣,你可以做同樣的頂點索引,然後比較其對gl_VertexID

+0

因爲我使用三角形作爲圖元,所以我在我提供的代碼中將當前處理的片段(又名三角形)的顏色設置爲紅色(如果它與交叉面板匹配)。 如果片段着色器輸出片段的顏色而不是頂點的顏色,如何設置頂點的顏色? –

+0

是的,你說你有辦法找到選定的頂點嗎?一旦您知道所選頂點是「面號N」的「數字2」,那麼您的索引是3 * N + 2。你可以將它設置爲你的「indexTarget」,如果gl_VertexID == indexTarget,那麼你將它變成紅色。這只是一個例子,您想用作目標的有效索引值將受到您使用的是GL_ELEMENT_ARRAY_BUFFER和/或應用basevertex的影響。鏈接解釋了這個 – Edd

+0

據我所知(如果我錯了,請糾正我)OpenGL繪製基元插入基元頂點的顏色到基元內的每個像素。如果我做了這樣的事情: if(gl_vertexID == 1)color = vec3(1.0f,0.0f,0.0f);在頂點着色器中,我不會得到一個紅色的頂點。我會得到一個原始的部分是紅色的(因爲片段顏色內插了頂點的顏色),這不是我正在尋找的。但沒有什麼被塗成紅色。 –