0

看起来GPUImagePosterizeFilter它似乎很容易用纹理中的像素替换颜色。假设我有一张由 10 种灰度颜色组成的图像。我想用来自 10 个不同纹理样本的像素替换 10 种颜色中的每个像素范围。

创建纹理的正确方法是什么?我正在使用下面的代码(我不确定发送到的 alpha 参数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的方法。

4

1 回答 1

0

为了将颜色与来自 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) 调用从 gltexture 中查找替换颜色。

于 2014-02-28T03:05:31.723 回答