GPUImage заменяет цвета цветами из текстур

Смотря на GPUImagePosterizeFilter это кажется легкой адаптацией, чтобы заменить цвета на пиксели из текстур. Скажем, у меня есть изображение, которое сделано из 10 оттенков серого. Я хотел бы заменить каждый из диапазонов пикселей из 10 цветов на пиксели из 10 различных образцов текстуры.

Как правильно создавать текстуры? Я использую код ниже (я не уверен в альфа-аргументы, отправленные на CGBitmapContextCreate).

CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
size_t width = CGImageGetWidth(spriteImage);
size_t height = CGImageGetHeight(spriteImage);

GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte));
CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage);
CGContextRelease(spriteContext);

GLuint texName;
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
free(spriteData);
return texName;

Как правильно передать текстуру в фильтр? В мой основной я добавил:

uniform sampler2D fill0Texture;

В коде ниже texture это то, что передается из функции выше.

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(fill0Uniform, 1);

Когда я пытаюсь получить изображение от spriteContext его nil и когда я пытаюсь использовать пиксели из fill0Texture они всегда черные. Я думал о том, чтобы сделать это с 10 итерациями ключа цветности, но я думаю, что замена всех пикселей в измененном GPUImagePosterizeFilter это путь

1 ответ

Чтобы сопоставить цвета с выходными данными PosterizeFilter, я использую следующий код.

float testValue = 1.0 - (float(idx) / float(colorLevels));
vec4 keyColor = vec4(testValue, testValue, testValue, 1.0);

vec4 replacementColor = texture2D( tx0, textureCoord(idx));

float select = step(distance(keyColor,srcColor),.1);
return select * replacementColor;

Если цвет (уже постеризованный) передан в совпадениях, то замещающий цвет возвращается. Вызов textureCoord(idx) ищет замещающий цвет из текстуры.

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