0

これを見ると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方法が適していると思います。

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 に答える