Применение цветовой палитры к текстуре
Обновлено после многих глупых вопросов
Цель: применить текстурную палитру средствами 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 ответ
Решение
Что ж...
Я сделал несколько ошибок:
- Я создал неправильную палитру текстур.
- Я поместил paletteIndex как float, а не как int (неправильный тип единого параметра).
- Я не понял разницу между Textrue2D (координаты текстуры 0..1) и texelFetch (целочисленные координаты texel).
- Вызывает функцию
GL.Viewport (0, 0, w * 2, h * 2);
из-за этого изображение в два раза больше оригинала.
Все эти проблемы были решены, и теперь правильно применяет палитру к исходному изображению. Правильные шейдеры показаны выше. Спасибо за Ваше внимание.