2009-10-01 65 views
6

iPhoneのテクスチャのコントラストの明るさをに変更したいと思います。私はapple(GLImageProcessing)で提供されているサンプルを見てきましたが、一度に1つしか実行できませんでした(サンプルの両方のメソッドを呼び出すと前の結果が上書きされます)。OpenGL ESで明るさとコントラストを適用する

明るさは素晴らしい作品:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
if (brightness >= 1.0f) { 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); 
    glColor4f(brightness-1, brightness-1, brightness-1, brightness-1); 
} else { 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT); 
    glColor4f(1-brightness, 1-brightness, 1-brightness, 1-brightness); 
} 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

は、どのように私はこの後テクスチャにコントラストを追加することとなるだろうか?あるいは、OpenGL ES 2.0に移行し、シェーダでこれを行うのが良い選択でしょうか?

ここでリンゴ由来のサンプル中のコントラストのためのコードです:

glActiveTexture(GL_TEXTURE0); 
glVertexPointer (2, GL_FLOAT, sizeof(V2fT2f), &quad[0].x); 
glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &quad[0].s); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 

glActiveTexture(GL_TEXTURE1); 
glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_ALPHA); 
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 2); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS); 

glColor4f(h, h, h, 0.75 - 0.5 * h); // 2x extrapolation 
validateTexEnv(); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Restore state 
glDisable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 1); 
glActiveTexture(GL_TEXTURE0); 

あなたはおそらく正しい方向に私を指すものが大幅に

を高く評価されるようにOpenGL(ES)と私の経験はかなり限定されている推測できるとおり
+0

こんにちはアンティ、 あなたが見つけましたあなたの問題への解決策?私も知りたいのですが。 ありがとうございます! –

答えて

1

輝度調整されたイメージを同じサイズのフレームバッファテクスチャにレンダリングし、このテクスチャを画面にレンダリングするときにコントラスト調整を実行できます。

Image -> [Brightness] -> Texture -> [Contrast] -> Screen 

フレームバッファ上のいくつかの有用な読書やレンダリングにテクスチャー:

7

これは、少なくともOpenGL 2.1(私はOpenGL ESを使用していません)では、フラグメントシェーダではるかに簡単です。ブック "OpenGL Shading Language"は、19章の画像処理について説明しています。これらは明るさとコントラストを調整するためのシェーダを提供します。ここでは、2つの半分ずつを組み合わせた私のバージョンは、次のとおりです。

uniform sampler2D Texture; 
uniform float Brightness; 
uniform float Contrast; 
uniform vec4 AverageLuminance; 

void main(void) 
{ 
    vec4 texColour = texture2D(Texture, gl_TexCoord[0].st); 
    gl_FragColor = mix(texColour * Brightness, 
     mix(AverageLuminance, texColour, Contrast), 0.5); 
} 

編集:完全性についていくつかの詳細...

明るさとコントラストが非常に渡し、1.0のベース値を持っている

どちらの場合も、テクスチャは変更されません。 1.0より小さい値は輝度を減少させ、1.0より大きい値は増加させます。コントラストの値が1.0より小さい場合はテクスチャが灰色(コントラストが薄い)になり、値が1.0より大きい場合は灰色が薄くなり(コントラストが強くなります)。

クイックダーティグレー値のAverageLuminanceを(0.5,0.5,0.5,1.0)にすることができますが、テクスチャの適切な平均輝度を計算することでより良い結果が得られます。

+0

私は、フラグメントシェーダーをサポートしていないOpenGL ES 1.1(デバイスサポートのため)に固執することを好みます。シェーダなしでこれを行うことについての考えはありますか?おかげさまで、バックアップとして持っていると良いです。 – Antti

+0

よろしくお願いします。それは私にシェイダーを使ってもう少し遊ぶ良い言い訳を与えました:-)申し訳ありませんが、シェーダー以外のソリューションではあまり役に立ちません。テクスチャのコンバイナは、私の頭の中で最高の時を過ごすし、それらのアップルのものはかなり厄介です。 –

0

私のGLはちょっと錆びていますが、サンプルコードから見ると、これらは両方とも既存のシーンとブレンドするテクスチャを作成しています。したがって、テクスチャの両方をのテクスチャとして作成し、お互いにぶつからないようにして、の両方をブレンドしてください。彼らは別のことをしていますが、同じテクスチャでそれらを組み合わせることはできません。私はそれがより複雑なブレンドなので、最初にコントラストを注文します。

関連する問題