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) ищет замещающий цвет из текстуры.