Применение цветовой палитры к текстуре

Обновлено после многих глупых вопросов

Цель: применить текстурную палитру средствами GL-шейдеров (эмулировать формат текстуры Indexed8). Интернет полон статей на эту тему, и все они содержат одно и то же решение. У меня есть, к сожалению, это не работает для меня.

Так.

Фрагмент шейдера:

uniform sampler2D texture;
uniform sampler2D palette;
uniform int paletteIndex;
layout (origin_upper_left) in vec4 gl_FragCoord;

void main()
{
    int colorIndex = int(texture2D(texture, gl_TexCoord[0].xy, 0).r * 255);
    gl_FragColor = texelFetch(palette, ivec2(colorIndex, paletteIndex), 0);
}

Вершинный шейдер:

void main () {
   gl_Position = ftransform ();
   gl_TexCoord [0] = gl_MultiTexCoord0;
}

Это мой результат (слева - моя фотография, справа - оригинал):

результат

Блин, я просто установил неверные координаты вершин! >.<

Спасибо за хорошего человека, который пытался помочь. Теперь я знаю, что отличается от texture2d и fetchTexel и нашел причину проблемы! D:

1 ответ

Решение

Что ж...

Я сделал несколько ошибок:

  1. Я создал неправильную палитру текстур.
  2. Я поместил paletteIndex как float, а не как int (неправильный тип единого параметра).
  3. Я не понял разницу между Textrue2D (координаты текстуры 0..1) и texelFetch (целочисленные координаты texel).
  4. Вызывает функцию GL.Viewport (0, 0, w * 2, h * 2); из-за этого изображение в два раза больше оригинала.

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

Другие вопросы по тегам