Как выложить часть текстуры в фрагментный шейдер - PullRequest
2 голосов
/ 25 июня 2019

Используя игровой движок Defold, он заставляет текстуры в атласе иметь степень 2 (384x216 -> 512x256). Функция «Развернуть» не поддерживает фон параллакса, доступны только следующие варианты:

  1. Управление позиционированием нескольких спрайтов с кодом
  2. Управление шейдером на одном спрайте.

Первый вариант не является элегантным и оптимизированным способом, поэтому я выбрал вариант №2.

У меня есть довольно простой код шейдера, который принимает масштаб и смещение исходного спрайта. Это работает, если спрайт имеет степень степени 2. Но я практически ничего не знаю, кроме этого, поэтому я не знаю, как выложить часть текстуры (оригинал не имеет степени 2). Я могу вычислить и дать форму, которая имеет пропорции vec2 (384/512, 216/256).

varying mediump vec2 var_texcoord0;
uniform lowp sampler2D texture_sampler;
uniform lowp vec4 tint;
uniform lowp vec4 scale;
uniform lowp vec4 offset;
void main()
{
   // Pre-multiply alpha since all runtime textures already are
   lowp vec2 uv = vec2(var_texcoord0.x *scale.x +offset.x, var_texcoord0.y *scale.y +offset.y);
   gl_FragColor = tint * texture2D( texture_sampler, uv);
}

Я ожидаю получить плиточный фон, но у него пустое пространство из-за принудительной мощности 2.

1 Ответ

2 голосов
/ 25 июня 2019

Итак, я получил помощь в сообществе Defold и получил фрагментный шейдер, подобный этому:

varying mediump vec2 var_texcoord0;

uniform lowp sampler2D texture_sampler;
uniform lowp vec4 tint;
uniform lowp vec4 size; //actually vec2 of pecentage (x,y)
uniform lowp vec4 scale;
uniform lowp vec4 offset;

void main()
{
    lowp vec2 uv = vec2(var_texcoord0.x *scale.x +offset.x, var_texcoord0.y *scale.y +offset.y);
    uv = vec2(mod(uv.x, size.x), mod(uv.y, size.y));
    gl_FragColor = tint * texture2D( texture_sampler, uv);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...