2012-06-20 161 views
3

我正在嘗試着寫一個着色器在文本週圍放置一個邊框。它編譯並運行正常,但邊界有顆粒感和別名。有什麼建議讓它更好嗎?GLSL邊框着色器

Shader

這是我寫所以不必對API很多知識第一着色器。請舉例說明任何示例代碼嗎?我不想複製和粘貼答案;我想了解它。

此外,當我將文字縮小時,出現問題,最好由此圖像解釋。有關修復這個問題的任何建議嗎?

Shader

邊緣檢測可能會更好過。到目前爲止,我採取的事實抗鋸齒紋理我使用的輸入與0.0 < alpha < 1.0

邊緣優勢到目前爲止,我有這樣的:

#ifdef GL_ES 
precision mediump float; 
#endif 
varying vec2 v_texCoord; 
uniform sampler2D u_texture; 
uniform vec4 u_borderColor; 
uniform float u_width; 
uniform float u_height; 

void main() 
{ 
    mediump vec4 total = vec4(0.0); 

    float alpha = texture2D(u_texture, v_texCoord).a; 
    //If somewhere between complete transparent and completely opaque 
    if (alpha > 0.0 && alpha < 1.0) 
    { 
     total.rgb = u_borderColor.rgb; 
     total.a *= u_borderColor.a; 
     gl_FragColor = u_borderColor; 
    } 
    else 
    { 
     gl_FragColor = texture2D(u_texture, v_texCoord); 
    } 
} 

回答

4

你爲什麼不設置gl_FragColor的價值總?阿爾法沒有更多的維護正確....

接下來,total.a = 1 - alpha; (從外到內)

或相似的變體:

total.a = ABS(0.5 - α); (混合雙方)

可能會更有意義,當混合。

+0

這產生了更好的結果,但仍然不適用於較小的文本。任何建議,以更好的邊緣檢測? –

+0

我打算將此答案標記爲正確,因爲它指出了我的代碼存在缺陷。但是,未來的觀衆應該注意到,它並沒有解決問題中提出的所有問題。我還沒有找到完美的解決方案。 –

+0

對於較小的規模,您必須通過另一個變化的浮動比例;然後乘以上面的alpha ... total.a = scale *(0.5 - alpha)等縮放縮小爲文本的大小縮小,所以它會產生一個更小的區域與粉紅色等只是試驗它,直到你得到很好的解決方案! :) –

0

在代碼中,我看到您的設置gl_FragColor = u_borderColor,如果alpha爲>0 <1,那麼這是(0,0,0,0)。首先將您的總體改爲其他對比顏色,然後您的代碼用於圖像。但文本具有不同的彎曲,這使得它變得粗糙,所以需要改變它的渲染,這是沒有代碼的情況下不能說的。 建議如果我錯了 謝謝