Мне нужно нарисовать моего персонажа, и для этого я использую шейдер.Пока все хорошо.Символ содержит черный и 4 шкалы цвета.Теперь я столкнулся с проблемой, которую я не могу найти разумного решения.
Мой шейдер использует шкалы цвета, чтобы решить, где рисовать.Я отлично работаю с изображениями 32х48.Но, чтобы сделать более детальное изображение, я пытаюсь использовать 64x96 (из-за творческих ограничений).Чтобы создать такое изображение, я пробую две вещи:
Первое. Создайте изображение в ilustrator, что приводит к одной проблеме: Ilustrator экспортирует изображение с помощью какого-либо линейного фильтра (аналогично тому, что делает линейный фильтр в Libgdx).).Когда я использую это изображение, пиксели границы смешиваются с черными линиями, что делает его из диапазона цветов, который я сделал.В результате шейдеры закрашивают неправильные пиксели.
Два - Создать изображение пиксель за пикселем (в 64x96) в любом редакторе.Это работает нормально, но приводит к двум проблемам.Первая проблема заключается в том, что экран недостаточно велик для изображения, поэтому для его исправления используются фильтры Libgdx.Если я использую Linear, я получаю тот же сценарий, что и в Ilustrator, где он рисует неправильные пиксели.Если я использую Nearest, он хорошо рисует пиксели, но линии становятся размытыми во время движения спрайта.Некоторые строки получают 2 пикселя в одном кадре, а в других - 1 пиксель.сделать его "танцующим" ..
Пример
Итак, мне было интересно, есть ли способ применить мой шейдер, нарисовать изображение, как я хочуи только после этого применять фильтр?(линейно было бы здорово).Таким образом, я бы отлично нарисовал свой пиксель, и тогда фильтр заставил бы его хорошо выглядеть на экране.
Или у кого-нибудь есть другое предложение?Спасибо
Редактировать
По запросу, вот мои шейдеры:
Vert
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec2 v_texCoords;
varying float colora;
varying float colorb;
varying float colorc;
varying float colord;
void main() {
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
colora = a_color.r;
colorb = a_color.g;
colorc = a_color.b;
colord = a_color.a;
}
Фрагмент
#ifdef GL_ES
precision mediump float;
#endif
const float red0 = 0.875; // 223.125 #df0000
const float red2 = 0.625; // 159.375 #9f0000
const float red4 = 0.375; // 95.625 #5f0000
const float red6 = 0.125; // 31.875 #1f0000
uniform sampler2D texture;
uniform sampler2D colorTable;
varying vec2 v_texCoords;
varying float colora;
varying float colorb;
varying float colorc;
varying float colord;
bool equalVecs(in vec4 v1, in float r) {
return abs(v1.r - r) < 0.05 && v1.g <0.01 && v1.b < 0.01 && v1.a > 0.99;
}
void main()
{
vec4 color = texture2D(texture, v_texCoords);
gl_FragColor = color;
if (equalVecs(color, red0)) {
gl_FragColor = texture2D(colorTable, vec2(0, colora));
} else if (equalVecs(color, red2)) {
gl_FragColor = texture2D(colorTable, vec2(0, colorb));
} else if (equalVecs(color, red4)) {
gl_FragColor = texture2D(colorTable, vec2(0, colorc));
} else if (equalVecs(color, red6)) {
gl_FragColor = texture2D(colorTable, vec2(0, colord));
}
}