2012-06-20 2 views
3

Я пытаюсь написать шейдер, чтобы поместить границу вокруг текста. Он компилируется и работает нормально, но граница зернистая и сглаженная. Любые предложения по его улучшению?GLSL Border Shader

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 в общей сложность? Alpha больше не поддерживается.

Далее, total.a = 1 - alpha; (От внешнего до внутреннего)

или вариант, как:

total.a = ABS (0,5 - альфа); (смешать обе стороны)

, вероятно, имеет больше смысла, когда смешивание.

+0

Это привело к лучшим результатам, но по-прежнему не пригодно для текста меньшего размера. Любые предложения для лучшего обнаружения края, пожалуйста? –

+0

Я собираюсь отметить этот ответ правильно, потому что он указал на недостаток моего кода. Тем не менее, следует отметить, что он не решает все вопросы, поднятые в вопросе. Я еще не нашел идеального решения. –

+0

Для меньшего масштаба вам нужно пройти еще одну переменную шкалу поплавка; и умножить альфа выше с ним ... total.a = scale * (0.5 - alpha) и т. д. масштаб сжимается по мере уменьшения размера текста, поэтому он даст меньшую область с розовым и т. д. Просто экспериментируйте с ней, пока не получите хорошее решение! :) –

0

В коде я вижу, что ваша настройка gl_FragColor = u_borderColor, которая составляет (0,0,0,0), из общей суммы, если альфа составляет >0 <1. Сначала измените общее количество на другой контрастный цвет, и ваш код работает для изображения. но текст имеет разные изгибы, что делает его зернистым, поэтому нужно изменить его рендеринг, который нельзя сказать без кода. Предлагаю, если я ошибаюсь Спасибо