2

私はOpenGLが初めてです。LWJGL と Slick で Java を使用しています。これまでのところ、いくつかのテクスチャを描画でき、バッファーを使用して、画面に表示されている画像を後処理用のテクスチャにコピーできます。glColor3f() を使用して、画面を目的の色にすることができます (青のみ、赤のみ、青と緑のチャネルのみを表示するなど)。

しかし、glColor3f(r, g, b) が行うことは、r、g、b の値を現在のピクセルに乗算することだけです。R、G、B がピクセルの現在の値である場合、glColor が行うことは、すべてのピクセルに対して (R*r、G*g、B*b) です。

私がやりたいことは、現在の値 R、G、B を使用して、たとえば赤のチャンネルを青のチャンネルに交換できるようにすることです。

(ロ、RG)

または、これらの値と新しい値を算術演算に使用します

(R+G*r, (B+g)/5, B*0.2)

私の目的は、グレースケール テクスチャを作成し、すべてのピクセルの色 (R、G、B) を次のように変更することです。

color = (R*0.5 + G*0.5 + B*0.5)/3
functionThatChangesColor(color, color, color);

どうすればこれまたはそれに似たものを達成できますか?

ありがとう!

4

1 に答える 1

1

コンポーネントのスウィズルを実装するシェーダーを使用します。OpenGL の新しいバージョンでは、テクスチャのコンポーネント スウィズリングをテクスチャ パラメータとして設定することもできます。http://www.opengl.org/wiki/Texture#Swizzle_maskを参照してください

スウィズルマスク

GLSL シェーダーは、テクスチャ関数によって返された vec4 値を完全に並べ替えることができますが、多くの場合、コードからテクスチャからフェッチされたデータの順序を制御する方が便利です。これは、swizzle パラメーターを介して行われます。

テクスチャ オブジェクトは、スウィズリング パラメータを持つことができます。これは、カラー イメージ形式のテクスチャでのみ機能します。4 つの出力コンポーネント RGBA のそれぞれを、特定のカラー チャネルから取得するように設定できます。スウィズル マスクは、テクスチャ サンプラーまたはイメージ ロード ストアを介するかどうかにかかわらず、すべての読み取りアクセスで尊重されます。

コンポーネントの出力を設定するには、GL_TEXTURE_SWIZZLE_C テクスチャ パラメータを設定します。ここで、C は R、G、B、または A です。これらのパラメータは、次の値に設定できます。

  • GL_RED: このコンポーネントの値は、> 画像の赤チャンネルから取得されます。すべてのカラー フォーマットには、少なくとも 1 つの赤チャンネルがあります。
  • GL_GREEN: このコンポーネントの値は、画像の緑チャンネルから取得されます。緑チャンネルがない場合は 0 です。
  • GL_BLUE: このコンポーネントの値は、画像の青チャンネルから取得されます。青チャンネルがない場合は 0 です。
  • GL_ALPHA: このコンポーネントの値は、画像のアルファ チャネルから取得されます。アルファ チャネルがない場合は 1 です。
  • GL_ZERO: このコンポーネントの値は常に 0 です。
  • GL_ONE: このコンポーネントの値は常に 1 です。

GL_TEXTURE_SWIZZLE_RGBA パラメータを使用して、4 つすべてを一度に設定することもできます。これは 4 つの値の配列を取ります。例えば:

//Bind the texture 2D.
GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

これにより、シェーダーがアクセスしたときに、イメージ内の赤のチャネルがアルファ > チャネルに効果的にマップされます。

于 2012-11-11T21:02:36.733 に答える