2014-02-26 11 views
0

GPUImagePosterizeFilter에서 보면 색상을 텍스처의 픽셀로 대체하는 것이 쉬운 것처럼 보입니다. 10 그레이 스케일 색상으로 만들어진 이미지가 있다고 가정 해보십시오. 10 가지 색상의 픽셀 범위 각각을 10 가지 텍스처 견본의 픽셀로 대체하고 싶습니다.GPUImage는 텍스처의 색상으로 색상을 대체합니다.

텍스처를 만드는 적절한 방법은 무엇입니까? 나는 아래 코드를 사용하고있다. (나는 CGBitmapContextCreate에 보낸 alpha 인수에 대해서는 잘 모르겠다.)

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); 

때 나는 spriteContextnil에서 이미지를 얻으려고 내가 fill0Texture에서 픽셀을 사용하려고 할 때 그들은 항상 검은 색 이제까지. 10 개의 크로마 키 반복을 사용하여이 작업을 수행 할 생각 이었지만 수정 된 GPUImagePosterizeFilter의 모든 픽셀을 교체하는 것이 좋습니다.

+0

두 입력 필터로 설정하고 이미지를 GPUImagePicture로 두 번째 입력으로 전달해야 할 것입니다. 하지만 이렇게하지 않고 포스터 화 후에 GPUImageLookupFilter를 두 번째 패스로 사용하는 것이 좋습니다. http://liovch.blogspot.com/2012/07/add-instagram-like-effects-to-your -ios.html –

+0

PosterizeFilter 버전으로 모든 작업을 할 수 있습니다. 하지만 이제 LookupFilter를 살펴 보겠습니다. –

답변

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에서 대체 색상을 찾습니다.