2

glsl( source )によって開発されたシャープ化コード

uniform sampler2D sampler;

uniform vec2 offset[9];

uniform int kernel[9];

void main()
{
vec4 sum = vec4(0.0);
int i;

for (i = 0; i < 9; i++) {
vec4 color = texture2D(sampler, gl_TexCoord[0].st + offset[i]);
sum += color * kernel[i];
}

gl_FragColor = sum
}

4 チャンネルの画像で動作しますが、単一のチャンネルで動作させたい場合はどうすればよいですか? vec1 のようなものが見つかりません。単一チャンネルの画像を 3 チャンネルの画像に変換する以外に解決策はありますか?

4

3 に答える 3

7

非シャドウ サンプラーにアクセスするときはいつでも、実際のフォーマットのチャンネル数に関係なく、g vec4 を取得します ( float、 integer、unsigned integerのg場合は何もない可能性があります)。iu

テクスチャのイメージ フォーマットに含まれていない値 (つまり、赤のみのテクスチャから緑のコンポーネントを要求する場合) は、ゼロで埋められます。要求するコンポーネントがアルファでない限り、アルファの場合は 1 になります。

テクスチャ オブジェクトのスウィズル設定を使用して、いつでも新しい値を作成できることを忘れないでください。したがって、単純なスウィズル マスクを使用すると、値が 1 つしか格納されていないテクスチャを、値が 4 つ格納されているように見せることができます。

GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

これは、古い GL_INTENSITY テクスチャと同様に、テクスチャの赤チャンネルを 4 つのコンポーネントすべてにブロードキャストします。アルファ版からのみ出てくるように、それらを入れ替えることができます。

GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

または、他のすべてのチャネルを 1 にしたい場合:

GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
于 2013-06-05T22:10:11.590 に答える