3

アプリの一部として、画像の反転を作成しようとしています。Apple の GLImageProcessing デモに従って、openGL を使用していくつかの画像処理を実装しました。

私の画像は .jpg から読み込まれ、テクスチャに読み込まれます。コントラストと明るさを喜んで変更できます。

ただし、反転イメージ (黒を白に交換) を作成しようとすると、満足のいく結果が得られません。いくつかのアプローチを試しましたが、デバイスではうまく機能しません。これまでのところ、私は試しました。 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); これはシミュレーターではうまく機能しますが、デバイスでは不安定な結果になります。私も試しました。 glBlendFunc(GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_DST_COLOR); これにより、以前と同様に結果が作成されます。最後に、試してみました。 glLogicOp(GL_XOR); これは、画像と黒い画面を切り替えるだけです。

私の画像を反転するための(比較的)簡単な解決策を提案できますか?

4

3 に答える 3

1

このシェーダーはどうですか:

void main() {
    vec4 color = texture2D(texture, textureCoordinate);
    float inverted = 1.0 - color.r; 
    vec4 inverted_vec = vec4( vec3(inverted), 1.0);
    gl_FragColor = clamp(inverted_vec, 0.0, 1.0);"
};
于 2012-12-15T19:09:51.070 に答える
1

OpenGL ES 2.0 を使用できる場合 (実際には 1.1 のみのデバイスがごく一部であることを考えると、安全に使用できるはずです)、これを行う簡単な方法は、オープン ソースのGPUImageフレームワークとその GPUImageColorInvertFilter を使用することです。

次のコードは、ディスクから画像を読み込み、色反転フィルターを作成し、そのフィルターを適用してから、使用する UIImage を吐き出します。

UIImage *inputImage = [UIImage imageNamed:@"image.jpg"];
GPUImageColorInvertFilter *stillImageFilter = [[GPUImageColorInvertFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter imageByFilteringImage:inputImage];

結果の画像を単に画面に表示するか、テクスチャとして使用する場合は、代わりにフィルターを GPUImageView または GPUImageTextureOutput に送信して、Core Graphics のオーバーヘッドを回避できます (出力 UIImage の生成による)。

于 2012-12-17T15:48:27.890 に答える
0

透明度がない場合は、最初に画像があるべき場所に白い四角形を描くことをお勧めします (テクスチャはなく、真っ白な色だけです)。次にglBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR)、アルファ チャネルを使用して無効にしglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE)、グレースケール テクスチャを描画します。透明度が必要ない場合は、これにより目的の効果が得られます。それ以外の場合は、テクスチャがアタッチされた FBO を使用して同じことを行う必要があります。また、テクスチャを描画した後、アルファ チャネルを再度有効にします。

于 2012-12-17T11:53:57.657 に答える