我有一些簡單的多邊形(少於20個頂點)在簡單的xy平面上使用GL_TRIANGLES和平面顏色進行2D模擬。使用片段着色器在2D多邊形上繪製邊框
我想爲這些多邊形添加可變厚度和不同顏色的邊框。我有使用相同的頂點和glLineWidth/GL_LINE_LOOP實現的東西,它可以工作,但是是另一個渲染過程並重復所有的頂點變換。
我想我應該可以在片段着色器中使用gl_FragCoord和頂點數據和/或紋理座標來做到這一點,但我不確定,而且我的天真嘗試顯然不正確。
我想像下面這樣。
uniform vec2 scale; // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;
varying vec4 vertex; // in world coords
void main()
{
if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
{
// we're close to the edge the polygon, so we're the border.
gl_FragColor = border_color;
}
else
{
gl_FragColor = fill_color;
}
}
我試圖找出的部分是distance_from_edge函數 - 如何計算?正在使用gl_FragCoord錯誤的方法 - 我應該使用某種紋理映射嗎?
作爲一個實驗,我試着用頂點將頂點轉換爲像素空間,然後計算像素與gl_FragCoord之間的距離,但這給出了我不太明白的奇怪結果。另外我需要的距離邊緣,而不是頂點,但我不知道如何得到這一點。
任何想法?
編輯:基於尼科爾的反應,我的問題是:
假設我有一個標記爲邊緣頂點3角落頂點的三角形,並在中間一個頂點標爲未EDGE(3個三角形所以呈現總計),那麼如何在片段着色器中插入以繪製給定厚度的邊界?我假設我將邊緣標誌傳遞給了片段着色器,以及所需的線條粗細,並且它會執行一些插值計算來計算邊緣與不是邊緣頂點之間的距離,並將顏色閾值限制爲邊框/填充?
'gl_FragCoord'將是大規模對你無益。這只是告訴你片段在屏幕上的位置;它沒有說明碎片相對於三角形的位置。頂點位置同樣會大量無益。您將需要頂點着色器/用戶提供的數據的幫助,該數據根據頂點是否是頂點將頂點的值放入頂點,然後插值。這意味着你無法檢測到單個三角形的邊緣;您必須將三角形分成幾個三角形,以便區分內部頂點和邊緣頂點。 –
謝謝,我懷疑我錯過了一些東西。所以如果我有一個帶有3個頂點的三角形標記爲邊緣頂點,並且中間的一個不是(用四個三角形渲染),那麼如何內插到邊界的給定線寬? – bloodearnest