У меня есть шрифт поля расстояния, который я бы хотел отобразить с помощью вертикального градиента. Проблема, с которой я сталкиваюсь, - это не получается, если есть простой способ получить координату y относительно глифа, который я получаю от атласа текстур шрифтов.Добавление градиента к растровому шрифту с использованием шейдеров в OpenGL
Я использую LibGDX. Я могу использовать v_texCoord.y, чтобы получить позицию относительно текстуры. Есть ли простой способ получить позицию y относительно области текстуры, которую я просматриваю для текущего символа? Как только у меня получится, я могу просто использовать mix (...) для создания градиента в шейдере фрагмента.
Vertex Shader
attribute vec4 a_position;
attribute vec2 a_texCoord0;
attribute vec4 a_color;
uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoord;
void main()
{
gl_Position = u_projTrans * a_position;
v_texCoord = a_texCoord0;
v_color = a_color;
}
Фрагмент Shader
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D u_texture;
uniform float u_boldness;
uniform float u_smoothing;
varying vec4 v_color;
varying vec2 v_texCoord;
void main()
{
float distance = texture2D(u_texture, v_texCoord).a;
float alpha = smoothstep(0.5 - u_boldness - u_smoothing, 0.5 - u_boldness + u_smoothing, distance);
gl_FragColor = vec4(v_color.rgb * alpha, alpha * v_color.a);
}
Вы можете сэкономить немного памяти, перемещая поле расстояния от альфа-канала на голубой канал, который мы не использовали. Тогда ваш PNG будет 24 бит вместо 32 бит. И замените textureColor.a на textureColor.b в шейдере. – Tenfour04
Отличный ответ. Я вижу, что это должно сработать - теперь, если бы я мог получить файл, сохраненный с цветовыми каналами, установленными так, как они мне нужны! :-) –