Фильтр Libgdx Shader plus - PullRequest
       27

Фильтр Libgdx Shader plus

0 голосов
/ 14 октября 2018

Мне нужно нарисовать моего персонажа, и для этого я использую шейдер.Пока все хорошо.Символ содержит черный и 4 шкалы цвета.Теперь я столкнулся с проблемой, которую я не могу найти разумного решения.

Мой шейдер использует шкалы цвета, чтобы решить, где рисовать.Я отлично работаю с изображениями 32х48.Но, чтобы сделать более детальное изображение, я пытаюсь использовать 64x96 (из-за творческих ограничений).Чтобы создать такое изображение, я пробую две вещи:

Первое. Создайте изображение в ilustrator, что приводит к одной проблеме: Ilustrator экспортирует изображение с помощью какого-либо линейного фильтра (аналогично тому, что делает линейный фильтр в Libgdx).).Когда я использую это изображение, пиксели границы смешиваются с черными линиями, что делает его из диапазона цветов, который я сделал.В результате шейдеры закрашивают неправильные пиксели.

Два - Создать изображение пиксель за пикселем (в 64x96) в любом редакторе.Это работает нормально, но приводит к двум проблемам.Первая проблема заключается в том, что экран недостаточно велик для изображения, поэтому для его исправления используются фильтры Libgdx.Если я использую Linear, я получаю тот же сценарий, что и в Ilustrator, где он рисует неправильные пиксели.Если я использую Nearest, он хорошо рисует пиксели, но линии становятся размытыми во время движения спрайта.Некоторые строки получают 2 пикселя в одном кадре, а в других - 1 пиксель.сделать его "танцующим" ..

Пример Example

Итак, мне было интересно, есть ли способ применить мой шейдер, нарисовать изображение, как я хочуи только после этого применять фильтр?(линейно было бы здорово).Таким образом, я бы отлично нарисовал свой пиксель, и тогда фильтр заставил бы его хорошо выглядеть на экране.

Или у кого-нибудь есть другое предложение?Спасибо

Редактировать

По запросу, вот мои шейдеры:

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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...